У меня есть сетевой код с сильным разбором JSON. Это необходимо сделать в фоновом режиме, чтобы не блокировать основной поток. Код выглядит следующим образом:AFSetworking background JSON parsing avoid block nesting
-(void) getSomeDataWithParameters:(...)parameters completion:(void (^)(NSArray *data))completion
{
NSURLRequest *req = ...
AFJSONRequestOperation *op = [[AFJSONRequestOperation alloc] initWithRequest:req];
// sometimes I have more requests
// startOperations is a wrapper on AFHTTPClient enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:
// that handles errors and loading views
[self startOperations:@[op] completionBlock:^(NSArray *operations) {
// getBgQueue = return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(getBgQueue(), ^{
NSArray *data = [MyParserClass parseJSON:op.responseJSON inContext:self.localContext];
[self.localContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
// this is executed on main thread
if(completion) completion(...);
}];
});
}];
}
(AFNetworking 1.x)
выше код работает очень хорошо, но это боль для настройки и писать. И часто весь контент метода обернут внутри другого блока, чтобы сначала получить некоторые требуемые данные ... в основном блоки просто накапливаются и делают уродливый код
Я использую enqueueBatchOfHTTPRequestOperations
, а не отдельные блоки завершения на AFJSONRequestOperation
, поскольку блок завершения партии иногда срабатывал перед всеми отдельными этапами завершения операций ... (Я также читал, что Мэтт не поощрял это делать)
Любые указатели на то, как это сделать лучше?
Спасибо, я реализовал нечто похожее на параметр 'completeQueue'. Быстрый вопрос: можно ли написать аналогичный код только с 'NSOperation'/'NSOperationQueue', а не блокировать? – userD