Почему iOS задерживает сохранение основных данных через UIManagedDocument? - PullRequest
2 голосов
/ 20 марта 2012

Я использую Core Data для сохранения некоторой информации в базе данных SQLite. Я тестирую на симуляторе и использую sqlite3 для запроса к базе данных и проверки того, что я храню то, что ожидаю.

Я вижу, что данные не появляются в базе данных SQLite в течение 15-20 секунд после того, как я их сохранил.

Вот код, который я сократил до:

NSEntityDescription *customerType = [NSEntityDescription entityForName:@"CustomerType" inManagedObjectContext:context];
CustomerType *ct = [[CustomerType alloc]initWithEntity:customerType insertIntoManagedObjectContext:context ];
ct.code = code;

NSError* error = nil;
if (![context save:&error] || error)
    NSLog(@"Saved new customer (error=%@)", [error debugDescription]);

Операция сохранения завершается без ошибок.

Любые намеки на то, почему я вижу эту задержку? Моя операция сохранения не выполняется должным образом, или задержка сохранения данных является артефактом симулятора?

Ответы [ 3 ]

5 голосов
/ 26 апреля 2012

Потому что вы должны использовать:

    [self.document saveToURL:self.document.fileURL
            forSaveOperation:UIDocumentSaveForOverwriting
           completionHandler:^(BOOL success) {                   
               if (success) {                       
                   NSLog(@"saved");
               } else {                       
                   NSLog(@"unable to save");
               }
               }];
2 голосов
/ 20 марта 2012

решение!

Я создаю NSManagedObjectContext через UIManagedDocument. Для своевременного сохранения данных мне нужно сохранить управляемый документ, а не просто сохранить изменения, которые я внес в граф объектов в контексте управляемого объекта.

0 голосов
/ 01 октября 2012

UIManagedDocument имеет вложенную родительскую / дочернюю контекстную архитектуру.Задержка вызвана тем, что родительский контекст не был сохранен вручную.То, что вы сделали, это только зафиксировали изменения из дочернего контекста в родительский контекст, а не из родительского контекста в постоянное хранилище.Автосохранение родительского контекста время от времени вызывается средой выполнения, отсюда и задержка.

Исправление простое: либо сохраните документ с помощью saveToURL, как предложил Флинк, либо сохраните ОБА дочерний контекст и родительский контекст.Первый подход проще и работает в большинстве ситуаций.Если вы хотите использовать второй подход, будьте осторожны, чтобы правильно ссылаться на каждый контекст.document.managedObjectContext даст вам контекст CHILD (в главном потоке), document.managedObjectContext.parentContext вернет вам родительский контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...