سؤال

لدي قاموس للأشياء.كلها كائنات POCO يجب أن تكون قابلة للتسلسل.ما هي التقنية التي يجب أن أبحث عنها لكتابة هذه على القرص.أنا أبحث عن أبسط خيار لكتابة بعض القوائم لحفظ الحالة.

أعتقد أن لدي 3 خيارات.

  1. ملفات بليست.ومع ذلك، يبدو أن هذا يقتصر على تخزين الكائنات المحددة مسبقًا (السلاسل والأرقام وما إلى ذلك) وليس الكائنات (مثل شخص له اسم وعمر).

  2. البيانات الأساسية.(الجديد في الإصدار 3.0) قد يعمل هذا بشكل جيد؛ومع ذلك، سيحتاج نموذج البيانات الخاص بي إلى التغيير لإنجاز هذا العمل.سيكون هذا بمثابة إعادة صياغة ضخمة ولست متأكدًا مما إذا كان الأمر يستحق كل هذا الجهد.

  3. SQLLite.تنفيذ قاعدة بيانات SQL بسيطة للقراءة منها وإليها.لقد قمت بأقل قدر من البحث في هذا، لكنني لا أريد أن أضطر إلى "إعادة كتابة" بعض وظائف ORM للبيانات الأساسية.

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك بنفس الطريقة التي تفعلها بها على نظام التشغيل Mac OS X:يجب أن تتوافق POCOs الخاصة بك مع NSCoding بروتوكول.يرى هنا للحصول على مرجع مفاهيمي، و هنا للحصول على مرجع NSCoding.

إذا لم تكن البيانات واسعة النطاق إلى هذا الحد ولم يكن لديك علاقات معقدة بشكل يبعث على السخرية بين الكائنات الخاصة بك، فمن المحتمل أن تكون كتابة كل شيء كقائمة هي الخيار الأفضل لك؛إنه سريع جدًا في التنفيذ وسهل التنفيذ في التعليمات البرمجية الخاصة بك.كما قلت، من المحتمل أن تكون CoreData عبارة عن ملف كثير من العمل الإضافي لتكييف التعليمات البرمجية الخاصة بك، وsqlite جيد حقًا فقط لتخزين البيانات المثالية لتخزينها في قاعدة بيانات علائقية.ضع في اعتبارك أن sqlite أيضًا أبطأ ويستخدم موارد أكثر من العمل مع القوائم الثنائية.

نصائح أخرى

لإجراء تسلسل لكائن مخصص، ما عليك سوى التوافق مع ملف NSCoding بروتوكول.إذا كان الكائن الخاص بك يمتد إلى NSObject، فكل ما عليك فعله (على ما أعتقد) هو تنفيذ ما يلي (مثال لكائن الشخص):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@“Name”];
    [coder encodeInteger:age forKey:@“Age”];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@“Name”] retain];
    age  = [coder decodeIntegerForKey:@“Age”];
}

NSArray و NSDictionary تنفيذ بالفعل أساليب التسلسل.سيقومون بإجراء تسلسل لجميع الكائنات التي يحتفظون بها (إذا كانت الكائنات تطبق واجهة NSCoder - فإنها تفعل ذلك إذا قامت بتوسيع NSObject).NSObject encodeWithCoder و initWithCoder لا تفعل شيئًا بشكل افتراضي، لذلك ما لم تقم بتنفيذ التعليمات البرمجية الخاصة بك في فصولك الدراسية، فلن يتم إجراء أي تسلسل.

إذا كان لديك NSArray أو NSDictionary للكائنات، فيمكنك مزامنتها باستخدام:

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;

NSCoder هي لغة الكاكاو القياسية للتسلسل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top