saveToURL forSaveOperation обработчик завершения не выполняется

Я пытаюсь вызвать метод saveToURL forSaveOperation completeHandler для UIManagedDocument, однако блок завершения не выполняется. Он терпит неудачу в (1) при первой попытке сохранения и терпит неудачу в (2) при попытках после этого. Я не уверен, означает ли это, что он пишет на диск в первый раз или нет. Однако NSLogs в завершенииHandler вообще никогда не регистрируются.

- (void)useDocument
{
    CoreDataSingleton *cds = [CoreDataSingleton getInstance];
    UIManagedDocument *document = cds.document;
    NSURL *url = document.fileURL;
    if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
        NSLog(@"This is logged");
        [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
              NSLog(@"This is never logged");
              if (success) {
                  self.managedObjectContext = document.managedObjectContext;
              } 
          }];
            // (1) Fails here on the first go
    } else if (document.documentState == UIDocumentStateClosed) {
        NSLog(@"This is logged");
        [document openWithCompletionHandler:^(BOOL success) {
            NSLog(@"This is never logged");
            if (success) {
                self.managedObjectContext = document.managedObjectContext;
            }
        }];
            // (2) Fails here on the second go
    } else {
        self.managedObjectContext = document.managedObjectContext;
    }
}

Класс, который реализует это, представляет собой UIViewController, который является источником данных и делегатом UICollectionView. Когда я отключаю UIViewController в качестве источника данных, завершениеHandler завершается успешно, и устанавливается manageObjectContext.

Кто-нибудь знает, в чем проблема?


person davidkohn    schedule 19.04.2013    source источник
comment
Моя первая догадка заключалась бы в том, что document равно нулю, что объясняет, почему первый @"This is never logged" не печатается. Однако это не объясняет второго. UIDocumentStateClosed равно 1, так что второе условие if не будет выполняться для нулевого документа.   -  person paulmelnikow    schedule 19.04.2013
comment
CoreDataSingelton, документ и URL-адрес не равны нулю.   -  person davidkohn    schedule 19.04.2013
comment
Как вы называете этот метод? Он вызывается в основном потоке? Если вы добавите NSLog в конце useDocument, он выводится на печать, верно?   -  person paulmelnikow    schedule 20.04.2013
comment
И document является экземпляром UIManagedDocument, а не подклассом?   -  person paulmelnikow    schedule 20.04.2013
comment
Наконец, когда вы говорите здесь об ошибке, ваш код вызывает исключение?   -  person paulmelnikow    schedule 20.04.2013
comment
У меня та же проблема, когда блок завершения не всегда вызывается.   -  person Christian A. Strømmen    schedule 04.06.2013
comment
У меня была та же проблема, и оказалось, что я не вызывал обработчик завершения в основном потоке, поэтому dispatch_async(dispatch_get_main_queue(), ^{ }); решает это.   -  person Kelsea    schedule 28.03.2017


Ответы (2)


У меня была эта проблема, и она убивала меня. Попробуйте проверить свой код для создания URL. Убедитесь, что вы получаете путь к NSDocumentDirectory, а не к NSDocumentationDirectory, как было обнаружено в этом опубликовать.

person Lou Valencia    schedule 15.10.2013
comment
Ты спас мою задницу! Мой saveToURL: forSaveOperation:completionHandler: продолжал давать сбой (статус был НЕТ). Когда я изменил свой путь к NSDocumentDirectory, это сработало. Я сделал ошибку автозаполнения. - person Stefan Vasiljevic; 13.04.2014

Одна из причин, по которой SAVETOURL не выполняется, заключается в модели данных: установите атрибуты/отношения как необязательные. Для меня это сработало после целой недели стресса!!

person user1495472    schedule 25.02.2014