مفتاح غير موجود في كائن نسكيدونارشيفر
-
12-12-2019 - |
سؤال
أنا عادة ترميز البيانات الخاصة بي في NSFileWrapper
مثل هذا (أترك قليلا نسفيلورابر):
-(NSData*)encodeObject:(id<NSCoding>)o {
@autoreleasepool {
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:o forKey:@"data"];
[archiver finishEncoding];
return data;
}
}
وأنا عادة الحصول على البيانات الخاصة بي مرة أخرى عند القيام بذلك:
- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)p {
NSFileWrapper *wrapper = [self.fileWrapper.fileWrappers objectForKey:p];
if (!wrapper) {
NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", p);
return nil;
}
NSData *data = [wrapper regularFileContents];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSLog(@"%@", [unarchiver decodeObjectForKey:@"data"]);
return [unarchiver decodeObjectForKey:@"data"];
}
في بعض الأحيان ، أحصل على NSData
العودة (أنها ليست معدومة) ، ولكن [unarchiver decodeObjectForKey:@"data"]
سيعود لا شيء.يبدو كما لو أنه لا يوجد كائن للمفتاح @ "البيانات" على الرغم من أنه يجب أن يكون هناك.أعتقد أن شيئا ما قد حدث خطأ عند الترميز ، لكنني لست متأكدا من كيفية حل هذه المشكلة.هل يمكنني فقط أخذ كل ما هو موجود data
وترميزه, لا تقلق إذا كان قد حصل على المفتاح الصحيح?أعني أنه يجب أن يكون هناك "بيانات" رئيسية واحدة فقط.
المحلول
لماذا هو التعليمات البرمجية الخاصة بك معقدة جدا:) NSKeyedArchiver
الطبقة لديها أساليب المساعد من شأنها أن تفعل ما تريد أكثر بساطة :
// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o];
// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
لا تنتمي إلى StackOverflow