Поскольку блок разделяет область видимости с родителем, проще всего вообще не указывать тип возвращаемого значения.Например:
- (NSData *)returnData:(NSString *)urlString{
dispatch_queue_t concurrentQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
__block NSData *data; // the __block keyword allows this variable to be changed by a block
dispatch_sync(concurrentQueue, ^(NSData *)){ // here return type showing error
data = [NSData dataWithContentsOfURL:@"http://stackoverflow.com"];
});
return data;
}
Если вы хотите указать тип возврата, вы не можете использовать dispatch_sync()
, поскольку он принимает только блоки без типа возврата.Пример использования блоков вручную:
typedef NSData *(^MyDataBlock)();
MyDataBlock getData = ^ NSData *() {
return [NSData data];
};
NSData *data = getData();
Обратите внимание, что, поскольку вы не используете dispatch_sync()
во втором примере, этот код будет выполнять немедленно в текущей очереди вместоожидание, пока не появится некоторое доступное время процессора.Ожидание того, что у ЦП есть какое-то время простоя, на самом деле может быть быстрее, чем его немедленное выполнение.
Преимущество в том, что этот подход гораздо более гибкий, вы можете передавать переменную getData
другим методам и т. Д.они могли бы даже выполнить его в своем собственном вызове dispatch_sync()
, чтобы воспользоваться системой приоритетов GCD.