2013-04-11 4 views
0

Я тестировал его на днях, и он работал. Сегодня, вызывая этот метод, он никогда не вызывает блок завершения.iCloud - UIDocument saveToUrl не выполняет блок завершения

Есть ли случай, когда блок завершения не вызывается? Я помню, что Apple говорила, что ее всегда называют независимо от того, что произошло.

Вот код блока:

dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { 
      // Get ubiquitous url 
      NSURL *ubiq = [[NSFileManager defaultManager] 
          URLForUbiquityContainerIdentifier:nil]; 
      NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent: 
             @"Documents"] URLByAppendingPathComponent:fileName]; 

      // Create new CloudFile 
      CloudFile *file = [[CloudFile alloc]initWithFileURL:ubiquitousPackage]; 
      file.data = data; 
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onDocumentStateChanged:) name:UIDocumentStateChangedNotification object:file];    

      dispatch_async (dispatch_get_main_queue(), ^(void) { 
       [file saveToURL:file.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) { 
        NSLog(@"test"); 
        if (success) { 
         [self sendEvent:ICLOUD_FILE_SAVE_SUCCESSFUL object:file]; 
        } else { 
         [self sendEvent:ICLOUD_FILE_SAVE_FAILED]; 
         NSLog(@"kaiCloud: Saving failed. (%@)",fileName); 
        } 

       }]; 
      }); 

     }); 

EDIT: Обратите внимание, что я добавил NSLog (@ "тест"), и я не вижу его получение в журнал.

+0

действительно ли спасение на самом деле происходит? –

+0

Нет. Я не вижу его в iCloud. Странно то, что я ничего не изменил в коде, после того как вернулся, он больше не работает. – Sylpheed

+0

Вы можете добавить журналы для печати 'файл': перед внутренним' dispatch_async' и до сохранения файла (внутри внутреннего асинхронного вызова)? –

ответ

1

Я столкнулся с той же проблемой (вот как я нашел ваш вопрос).

Причина проста. Тестовый код не ждет вызова обработчика завершения и, конечно, не для его завершения.

Ваш тест может работать иногда, если он достаточно длинный или может застопориться. Но это ненадежно.

Используйте макросы WAIT, предоставленные и объясненные здесь, и проблема решена.

https://github.com/hfossli/AGAsyncTestHelper

Смежные вопросы