Я сделал это с делегатом. Итак, у меня есть код, который выглядит так:
[request setCompletionBlock:^{
NSLog(@"Data retrieved");
NSData *data = [request responseData];
NSLog(@"Status Code: %d", [request responseStatusCode]);
dispatch_async(backgroundQueue, ^(void){
[self processData:data];
});
}];
Что в основном говорит, что при выполнении этого блока завершения вызывается сообщение processData в фоновом режиме. В сообщении processData я использую делегата для возврата данных в мой основной поток пользовательского интерфейса. Это сообщение выглядит так:
- (void)processData:(NSData *)data {
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
dispatch_async(dispatch_get_main_queue(), ^(void){
[self.delegate requestDataReady:json];
});
}
Надеюсь, это поможет.
UPDATE:
Конечно, вам не нужно запускать метод процесса в фоновом потоке. Вы можете также легко вызвать [self processData: data] внутри блока или даже поместить код из processData внутри блока.