Как заархивировать массив NSSortDescriptor в Мохаве - PullRequest
0 голосов
/ 25 сентября 2018

У меня был код, который работал через High Sierra (10.13), который успешно архивировал и разархивировал массив дескрипторов сортировки в NSData, но оперативные вызовы в Мохаве исключены (10.14).Вот код, который работал:

NSArray<NSSortDescriptor*> *sortSettings = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:NO]];

NSData *sortData = [NSKeyedArchiver archivedDataWithRootObject:sortSettings];
NSArray<NSSortDescriptor*> *unarchivedSettings = [NSKeyedUnarchiver unarchiveObjectWithData:sortData];

// Test case passes
XCTAssertEqualObjects(unarchivedSettings.firstObject.key, @"title");

Я пытался использовать приведенный ниже код с вызовами, предложенными предупреждениями об устаревании, но он не работает.

NSArray<NSSortDescriptor*> *sortSettings = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:NO]];

NSError *archiveError = nil;
NSData *sortData = [NSKeyedArchiver archivedDataWithRootObject:sortSettings
                                         requiringSecureCoding:YES
                                                         error:&archiveError];
// Test cases pass
XCTAssertNotNil(sortData);
XCTAssertNil(archiveError);

NSError *unarchiveError = nil;
NSArray<NSSortDescriptor*> *unarchivedSettings = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class]
                                                                                   fromData:sortData
                                                                                      error:&unarchiveError];
XCTAssertNotNil(unarchivedSettings); // Fails
XCTAssertNil(unarchiveError); // Fails, with error below

Архивирование завершается успешно, возвращая NSData, но разархивированный вызов возвращает ошибку:

Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'NS.objects' was of unexpected class 'NSSortDescriptor'. Allowed classes are '{( NSArray )}'." UserInfo={NSDebugDescription=value for key 'NS.objects' was of unexpected class 'NSSortDescriptor'. Allowed classes are '{( NSArray )}'.}

1 Ответ

0 голосов
/ 25 сентября 2018

Вам необходимо перечислить все классы, которые архивируются (в данном случае NSArray и NSSortDescriptor):

[NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithArray:@[
                                              [NSArray class],
                                              [NSSortDescriptor class]
                                             ]]
                                    fromData:sortData
                                       error:&unarchiveError];
...