AFNetwork, Magical Record и сохранение блока внутри блока

Я использую AFNetworking для извлечения удаленных данных и Magical Record для их локального импорта и сохранения.

По сути, я вызываю волшебное сохранение записи с блоком в блоке завершения из метода AFNetworking, что приводит к тому, что мои модульные тесты зависают навсегда.

Вот код метода синхронизации. Он определен в классе SyncEngine и используется как синглтон.

NSArray *operations = … ; // An array of AFHTTPRequestOperation defined before
__block BOOL syncSuccess = … ; // Set by operations
__block NSDictionary *syncErrors = … ; // Set by operations

NSArray *batchedOperations =
    [AFURLConnectionOperation batchOfRequestOperations:operations
                                         progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
                                             // …
                                         }
                                       completionBlock:^(NSArray *operations) {
                                           NSMutableDictionary *allErrors = [NSMutableDictionary dictionaryWithDictionary:syncErrors];
                                           [_localContext saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error){
                                               if (!success && error)
                                                   allErrors[@"MR_saveToPersistentStore"] = error;
                                               syncCompletionBlock(syncSuccess && success, allErrors);
                                           }];
                                       }
     ];

    // _manager is a AFHTTPRequestOperationManager
    [_manager.operationQueue addOperations:batchedOperations waitUntilFinished:YES];

Таким образом, проблема возникает из-за того, что я вызываю «saveToPersistentStoreWithCompletion» в «completionBlock».

Если вместо этого я использую «saveToPersistentStoreAndWait», это работает, но тогда я не узнаю, было ли сохранение успешным или нет.

Как правильно вложить эти операции?


person Arnaud    schedule 17.03.2014    source источник


Ответы (1)


Я не знаком с AFNetworking 2.0, но не будет ли этот код вызывать сохранение много раз?

Не лучше ли сохраниться один раз после завершения всех пакетных операций?

person Aaron A.    schedule 06.04.2014
comment
Нет, не будет, progressBlock вызывается после каждой операции, но completeBlock вызывается один раз после завершения всех пакетных операций. - person Arnaud; 06.04.2014