سؤال

أنا عادة ترميز البيانات الخاصة بي في 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];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top