Сохранение UIManagedDocument — улучшение скорости

У меня есть следующий код, который используется в моем контроллере представления всякий раз, когда установлено его свойство «документ» (типа UIManagedDocument).

Я не уверен, что это делают другие люди, но я нахожу понятие параллелизма в Core Data очень запутанным, документы объясняют его, но все еще трудно понять. По этой причине мне было интересно, есть ли у людей какие-либо идеи о том, как ускорить код, который я использую для сохранения только что установленного UIDocument, если он не существует. Этот код работает, если другие захотят его использовать.

Моя главная цель — попытаться сократить время, необходимое для сохранения и загрузки документа, намного быстрее. В настоящее время это занимает около 20 секунд, что слишком долго!

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

if (![[NSFileManager defaultManager] fileExistsAtPath:self.documentDatabase.fileURL.path]) {
    [self.documentDatabase saveToURL:self.documentDatabase.fileURL
                    forSaveOperation:UIDocumentSaveForCreating
                   completionHandler:^(BOOL success) {
                       [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

                       if (success) {
                           NSLog(@"Saved %@", self.documentDatabase.localizedName);

                           dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                               [self.documentDatabase.managedObjectContext performBlockAndWait:^{
                                   dispatch_async(dispatch_get_main_queue(), ^{
                                       [Book newBookWithTitle:self.documentDatabase.fileURL.lastPathComponent.stringByDeletingPathExtension inManagedObjectContext:self.documentDatabase.managedObjectContext];

                                       [self saveDocumentWithCompletionHandler:^(bool success) {
                                           if (success) {
                                               [self setIsDocumentHidden:NO];
                                           }
                                       }];

                                       NSLog(@"Added default note to %@", self.documentDatabase.fileURL.lastPathComponent);
                                   });
                               }];
                           });
                       } else {
                           NSLog(@"Error saving %@", self.documentDatabase.fileURL.lastPathComponent);
                       }
                   }];
} else {
    [self openDocumentWithCompletionHandler:nil];
}

person Adam Carter    schedule 09.05.2013    source источник


Ответы (1)


20 секунд звучат немного экстремально, если только вы не имеете дело с обширной базой данных. Вы пробовали профилировать время процесса сохранения в инструментах?

Даже если задержка полностью связана с кодом фреймворка, иногда, углубившись в профиль времени, вы можете получить некоторый намек на то, что он делает, что занимает так много времени. Например, это только косвенно связано, но, делая это, я обнаружил, что сохранение UIManagedDocuments, которые были синхронизированы через iCloud, было полностью забито с точки зрения производительности из-за наличия обратных отношений в модели данных.

person Rob Glassey    schedule 18.05.2013