سؤال

ولدي كائن مخصص يرث ببساطة من NSObject. لها 3 أعضاء - اثنين من العوامات وNSDate

وبلدي التطبيق ستكون لدينا مجموعة واسعة مع عدد من هذه الكائنات الركل حولها، وأنا بحاجة إلى الاستمرار عليه بين أشواط. كيف يمكنني تحقيق ذلك؟

ولقد فكرت باستخدام ديسيبل سكليتي، ولكن أنا أفكر أنه من مبالغة بعض الشيء منذ الاستعلام الوحيد الذي يهمني من أي وقت مضى لا سيتم select *.

في عالم مثالي أود أن استخدام ملف xml بليست. لست متأكدا ما اذا كان يمكنني القيام بذلك مع كائن مخصص بلدي بالرغم من ذلك. أنا أعلم أن هناك مجموعة من الكائنات قائمة الممتلكات، ويأتي ذلك في إطار NSArray ذلك، ولكن writeToFile:atomically: يعمل فقط مع كائنات قائمة الممتلكات.

وسيكون موضع تقدير أي أفكار، وذلك بفضل!

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

المحلول

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

وسوف رمز لصفك ننظر بشيء من هذا القبيل:

-(void) encodeWithCoder: (NSCoder*) coder {
  [coder encodeInteger: versionValue forKey: versionKey];
  [coder encodeObject: myStuff forKey: myStuffKey];
}

-(id) initWithCoder: (NSCoder*) coder {
  self = [super init];
  if ( ! self) return nil;
  myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
  return self;
}

ومن المستحسن إضافة رقم الإصدار عند ترميز لتعطيك المرونة لإدارة التغييرات إلى تنسيق الأرشيف في الإصدارات المستقبلية.

في صفي، وأضفت طريقة مريحة لأرشفة كائن بلدي:

-(void) archiveToFile: (NSString*) path {
  NSMutableData *data = [[NSMutableData alloc] init];
  NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
  [archiver encodeObject: self forKey: myArchiveKey];
  [archiver finishEncoding];
  [archiver release];
  [data writeToFile: path atomically: YES];
  [data release];
}

ووآخر لإلغاء أرشفة أو إنشاء كائن جديد:

+(MyArchive*) newFromFile: (NSString*) path
            orWithMyStuff: (MyStuff*) myStuff
{
  NSData *data = [[NSData alloc] initWithContentsOfFile: path];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
  MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
  [unarchiver finishDecoding];

  if (myArchive) {
    [myArchive retain];
  } else {
    myArchive = [[MyArchive alloc] initWithStuff: myStuff;
  }
  [unarchiver release];
  [data release];
  return myArchive;
}

ومنذ كبار الكائن مستواك هو NSArray، ستحتاج إلى تعديل أساليب الماضيين لقضيتك، ولكن معظم رمز النمطي سوف تكون هي نفسها.

نصائح أخرى

إذا كنت تريد الذهاب الى لاسترداد مجموعة فرعية من الكائنات، سكليتي هو إلى حد بعيد افضل خيار لكم.

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

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