Обычно для асинхронных задач используют блоки
- (void)getData:(void(^)(id result))completionBlock {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"%@", error.description);
} else {
NSError *parsingError;
NSDictionary *parsedData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&parsingError];
if (parsingError) {
NSLog(@"Error while parsing data %@", parsingError.description);
} else {
dispatch_async(dispatch_get_main_queue(), ^{
if (completionBlock){
completionBlock(parsedData);
}
});
}
}
}];
[task resume];
}
Вызов выглядит так
[self getData:^(id result){
//process
}];
Да Вы, собственно, и сами пользуетесь этим способом в NSURLSession. Дабы избежать калбек хелла можно посмотреть в сторону PromiseKit
Еще один, уже почти забытый способ, через делегаты...