كيف يمكنني حفظ محتوى إضافي في حزم ملفات UIManagedDocument الخاصة بي؟

StackOverflow https://stackoverflow.com/questions/8351948

سؤال

أواجه صعوبة كبيرة في فك التشفير وثائق أبل حولها UIManagedDocument, ، وتحديداً الطرق التالية:

  • - (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error

هل نجح أي شخص في حفظ محتوى إضافي في دليل "محتوى الإضافة" داخل حزم UIManagedDocument الخاصة به؟إنني أتطلع إلى حفظ الصور المباشرة (PNG، JPEG، إلخ) ومقاطع الفيديو (m4v، إلخ) في هذا الدليل باستخدام UUIDs كأسماء ملفات (مع امتداد الملف الصحيح)، وتخزين المراجع لهذه الملفات الفردية باسم NSString مسارات الملفات داخل متجري المستمر.

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

المحلول

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

حسنًا، يعمل الأمر بشكل أساسي على النحو التالي:فئة فرعية UIManagedDocument, ، وتنفيذ الطرق التالية (حيث extraInfo الخاصية هي مجرد NSDictionary تم تنفيذها على فئتنا الفرعية):

- (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
{
   NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"];
   self.extraInfo = [NSDictionary dictionaryWithContentsOfURL:myURL];
   return YES;
}

- (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
{
   if (!self.extraInfo) {
       return [NSDictionary dictionaryWithObjectsAndKeys: @"Picard", @"Captain", [[NSDate date] description], @"RightNow", nil];
   } else {
       NSMutableDictionary *updatedFriendInfo = [self.extraInfo mutableCopy];
       [updatedFriendInfo setObject:[[NSDate date] description] forKey:@"RightNow"];
       [updatedFriendInfo setObject:@"YES" forKey:@"Updated"];

       return updatedFriendInfo;
   }
}

- (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error
{
   if (content) {
       NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"];
       [(NSDictionary *)content writeToURL:myURL atomically:NO];
   }

   return YES;
}

UIManagedDocument سوف يستدعي هذه الأساليب عندما تحتاج إلى ذلك، مما يؤدي تلقائيًا إلى حفظ كل ما تحتاج إلى حفظه في حزمة المستندات داخل ملف AdditionalContent الدليل.

إذا كنت بحاجة إلى فرض الحفظ، فما عليك سوى الاتصال بالرقم التالي على جهازك UIManagedDocument مثال:

[self updateChangeCount:UIDocumentChangeDone];

في الوقت الحالي، لا أستخدم هذا للصور ومقاطع الفيديو - ولكن المثال يجب أن يمنحك ما يكفي للانطلاق.

نصائح أخرى

وثائق -additionalContentForURL:خطأ:يشير إلى أن إرجاع الصفر من المفترض أن يشير إلى خطأ.

  A return value of nil indicates an error condition. To avoid generating 
  an exception, you must return a value from this method. If it is not always
  the case that there will be additional content, you should return a sentinel value (for example, an NSNull instance) that you check for in
  writeAdditionalContent:toURL:originalContentsURL:error:.

أنا تجاوز -writeContents:andAttributes:safelyToURL:forSaveOperation:error: لغرض آخر (القيام ببعض الأشياء عند الحفظ الأول لمستند جديد)، واستدعاء super يستدعي آلهة NSException لأن contents القيمة صفر، وليست NSDictionary كما هو متوقع بواسطة UIManagedDocument.همم.

كلما عرفت أكثر...

ملاحظة.أعتقد أن ذلك يعتمد على الوقت من اليوم باستخدام -writeContents:andAttributes:...لقد طرحت ذات مرة استثناءً يشكو من توقع NSDictionary، لكنه ألقى لاحقًا استثناءً يشكو من أنني لم أتمكن من اجتياز NSData.لا يمكن رفع حاجبي بطريقة تشبه سبوك أكثر مما هو عليه الآن.

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