এনএসউজারডেফাল্টসে এনএসডিট সংরক্ষণ করার সর্বোত্তম উপায় কী?


174

এনএসউসারডেফাল্টগুলিতে এনএসডিট সংরক্ষণ করার দুটি উপায় রয়েছে যা আমি পেরিয়ে এসেছি।

বিকল্প 1 - সেটঅজেক্ট: ফোরকি:

// Set
NSDate *myDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:myDate forKey:@"myDateKey"];

// Get
NSDate *myDate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"myDateKey"];

বিকল্প 2 - সময় অন্তর্বর্তী 19719 19

// Set
NSDate *myDate = [NSDate date];
NSTimeInterval myDateTimeInterval = [myDate timeIntervalSince1970];
[[NSUserDefaults standardUserDefaults] setFloat:myDateTimeInterval forKey:@"myDateKey"];

// Get
NSTimeInterval myDateTimeInterval = [[NSUserDefaults standardUserDefaults] floatForKey:@"myDateKey"];
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:myDateTimeInterval];

সুবিধা - অসুবিধা

বিকল্প 1

এটি কমপ্যাক্ট এবং যৌক্তিক বলে মনে হচ্ছে। যাইহোক, তারিখ ফর্ম্যাটর বাগগুলির কারণে আমি এটি ভুল হয়ে যাওয়ার বিষয়ে উদ্বেগ পেয়েছি ।

বিকল্প 2

এটিকে আনাড়ি বলে মনে হচ্ছে। আমি এর যথার্থতা সম্পর্কেও অনিশ্চিত - একটি পরীক্ষায় আমি করেছি, যখন আমি তারিখটি ফিরে পেয়েছিলাম তখন এটি 48 সেকেন্ডের মধ্যে শেষ হয়েছিল, যদিও অ্যাপল ডক্স বলেছিল যে এনএসটিমেআইন্টারভালটির "সাবসেকেন্ড যথার্থতা" রয়েছে।

আবশ্যকতা

আমি যে পদ্ধতি বেছে নিই না কেন এটি অবশ্যই:

  1. এক সেকেন্ডের মধ্যে যথাযথ

  2. পাঠযোগ্য এবং নির্ভরযোগ্য।

আমার প্রশ্ন

অপশন 2 এর সাথে অসম্পূর্ণতা কারণ আমি কিছু ভুল করছি?

এই দুটি বিকল্পের মধ্যে আপনি কোনটি ব্যবহার করবেন?

অন্য কোন বিকল্প আছে যা সম্পর্কে আমি অবগত নই?

ধন্যবাদ!

উত্তর:


380

আপনি অযথা জিনিস জটিল করছেন। আপনি কেন তারিখটিকে সময়ের ব্যবধানে রূপান্তর করছেন (তারপরে সময়ের ব্যবধানটি অন্য কোনও আদিমতায় রূপান্তরিত করবেন)? শুধু [sharedDefaults setObject:theDate forKey:@"theDateKey"]এবং এটি দিয়ে করা। পিএসএলটি ফর্ম্যাট (তারিখ, সংখ্যা, স্ট্রিংস, ডেটা, অভিধান এবং অ্যারে) দ্বারা সমর্থিত এনএসডিট হ'ল "প্রধান প্রকারগুলির মধ্যে একটি", যাতে আপনি কেবল এটি সরাসরি সঞ্চয় করতে পারেন।

প্রমাণের জন্য ডকুমেন্টেশন দেখুন ।

কেবলমাত্র তারিখটি সরাসরি সঞ্চয় এবং পুনরুদ্ধার করুন এবং এটি সঠিক জিনিসটি করুন (সময় অঞ্চল, যথার্থতা ইত্যাদি সহ) দেখুন। এতে কোনও ফর্ম্যাটর জড়িত নেই, অন্যরা বলেছে।


8
জোশুয়া, আপনার উত্তরের জন্য ধন্যবাদ। আমি নির্লিপ্ত সংশ্লেষিত ভাসমান পদ্ধতির চেষ্টা করার কারণটি ছিল কেবল কারণ আমি অন্য একজন দুর্দান্ত বিকাশকারীকে এটি করতে দেখেছি এবং আমি ভেবেছিলাম যে এটি কোনও ভাল কারণেই এটি সম্পন্ন করবে। অবশ্যই না. আমার নিজের প্রবৃত্তির প্রতি আমার আরও আস্থা থাকা উচিত, যা ছিল সেটঅবজেক্ট: ফোরকি: ব্যবহার এবং এটি দিয়ে have
জন গ্যালাগার 21

7
অহেতুক জটিলতার খুব চিন্তাভাবনার প্রতি আমি সম্পূর্ণ হিংস্র - বিকাশকারী এবং সাধারণত অলস লোকদের জন্য একটি ভাল বৈশিষ্ট্য। :-)
জোশুয়া নউজি

যেক্ষেত্রে এই পদ্ধতির ব্যবহার করা হয় বেশিরভাগ যখন NSUserDefaults একটি জেনেরিক মিডলওয়্যার জন্য ব্যবহারকারীর পছন্দ একটি স্টোরেজ বাস্তবায়ন হিসাবে ব্যবহার করা হয় হচ্ছে ...
নেকড়েবিশেষ

@ কোয়েট: যে ক্ষেত্রে এটি এখনও এনএসউসারডেফাল্টগুলির মাধ্যমে অ্যাক্সেস করা যায় বা সম্পত্তি তালিকা ফাইল থেকে বিশ্লেষণ করা হয়, তাই একই অ্যাক্সেস বা পার্সিংয়ের ফলে একটি উপযুক্ত এনএসডিট অবজেক্ট পাওয়া উচিত, যা প্রয়োজন অনুসারে রূপান্তর করা যায়।
জোশুয়া নোজি

3
@ জনগালাগের [সাইডবার] কোনও দরিদ্র ব্যক্তির জন্য কারও নির্দিষ্ট প্রয়োগকে ভুল করবেন না। আপনার আসল অনুভূতি "ভেবেছিল যে তিনি এটি কোনও ভাল কারণে করেছেন ... অবশ্যই না" আপনি কেবলমাত্র দেবের প্রয়োজনীয়তার পুরো সুযোগটি বুঝতে পারলে বৈধ হতে পারে। "এইভাবে এটি করার কোনও ভাল কারণ নেই" বলে তার দৃষ্টিভঙ্গিটিকে অন্ধভাবে লেবেল করা অহঙ্কারী এবং ঘনিষ্ঠ মনোভাবের। এটি বলা হচ্ছে, হ্যাঁ, আপনি যদি অন্যভাবে করার কোনও কারণ না রাখেন তবে আমি যিশুশুয়ের এটিকে সহজ রাখার পদ্ধতির সাথে একমত হব।
dooleyo

14

# 1 বিকল্পের জন্য, আমি বিশ্বাস করি না যে কোনও তারিখ বিন্যাস জড়িত। সম্ভবত হুডের নিচে, তবে আমি ধারণা করি এটি ভাঙ্গা হয়নি। তারিখটি আইএসও 8601 ফর্মে সংরক্ষিত আছে ।

# 2, ব্যবহার বিকল্পের জন্য -setDouble:forKey:এবং -doubleForKeyপরিবর্তে floatভিত্তিক সংস্করণ। এটি আপনার নির্ভুল ত্রুটির কারণ হতে পারে।


বাহ, জন আপনার খুব দ্রুত উত্তর জন্য ধন্যবাদ। আপনি ব্যক্তিগতভাবে কোনটি ব্যবহার করবেন?
জন গালাগার

8
সময় ব্যবধান নয়, সরাসরি তারিখটি ব্যবহার করুন। আমি সন্দেহ করি যে এতগুলি অ্যাপ্লিকেশন নির্ভর করে যখন এই জাতীয় বেসিক এপিআইটি নষ্ট হয়ে যায়।
জন কলসবিেক

চমৎকার। এটি ছিল আমার প্রবৃত্তি, তবে আমি তৃতীয় পক্ষের কোডটি একটি শ্রদ্ধেয় দেবের দ্বারা দেখেছি যা ভাসমান পদ্ধতিটি ব্যবহার করেছিল তাই আমি ভেবেছিলাম যে তিনি এটি ব্যবহার করবেন এমন কোনও ভাল কারণ থাকবে। অবশ্যই না. আপনার উত্তরের জন্য আবার ধন্যবাদ!
জন গ্যালাগার

1
এটা সম্ভব যে আপনি যে কোডটি দেখেছেন তা হ'ল মনে রাখেনি যে কোন ধরণের সম্পত্তির তালিকায় সরাসরি কোন ধরণের স্টোর রাখা যেতে পারে।
জন কলসবিেক

2
রেকর্ডের জন্য - 32 বিট ফ্লোটগুলির যথার্থতার জন্য কেবল 24 বিট রয়েছে, সুতরাং 1970 থেকে এখন 40 বছর, যা 40 * 365 * 86400 সেকেন্ড, এবং (40 * 365 * 86 400) / (2 ** 24) = 75 সেকেন্ড ত্রুটি । ডেটটাইম ব্যবধান ডাবল স্পষ্টতা হ'ল এবং এর কা'র যথার্থতা এখন সেকেন্ডের মিলিয়নতমের চেয়ে ভাল।
টম অ্যান্ডারসন

5

NSUserDefaults ব্যবহার করুন; তারিখগুলি জুলু সময়ে সংরক্ষিত থাকে, তাই চিন্তার কোনও টাইম জোনের সমস্যা নেই। এটিকে আপনার টাইম জোনে সংরক্ষণ করুন, এটিকে অন্য সময় অঞ্চলে টানুন, আপনি ভাল থাকবেন, সিস্টেমটি রূপান্তরটি পরিচালনা করবে (চিন্তার কোনও তারিখ বিন্যাস নেই)।


0

আপনি যদি ফেসবুক গ্রাফ এপিআই থেকে মেয়াদ শেষ হওয়ার তারিখটি সংরক্ষণ করেন তবে আমি * বিকল্প 2 * ব্যবহার করব ।

অপশন দুটি সহজেই স্ট্রিংয়ে রূপান্তরিত হতে পারে (স্ট্রিংউইথ ফরম্যাট ব্যবহার করে)। সবচেয়ে গুরুত্বপূর্ণ, এটি গ্রাফ এপিআইয়ের জন্য কাজ করে।

এছাড়াও, আপনার তারিখের ফর্ম্যাট সম্পর্কে আপনাকে চিন্তা করতে হবে না। এনএসডিট ফরমেটার সাথে কাজ না করা 48 সেকেন্ডের ত্রুটির সম্ভাবনার পক্ষে মূল্যবান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.