Возможно, однако проблема с возвратом строки из этой функции заключается в том, что ей потребуется задержать ваш вызывающий поток, пока вы выполняете работу в фоновом режиме - таким образом теряется преимущество фонового потока. (dispatch_sync - это то, что вы бы использовали для этого - однако я бы не рекомендовал это).
При использовании блоков лучше всего реструктурировать вашу программу, чтобы она лучше соответствовала асинхронной парадигме. Когда работа завершена, он должен уведомить всех, кто ожидает результата, отправив ему сообщение с результатом. В вашем примере вы должны поместить это в блок кода, который вы отправляете в основную очередь.
@interface TagManager
- (void)fetchTag;
- (void)tagFetched:(NSString *)tag;
@end
@implementation TagManager
- (void)fetchTag {
// The following method does all its work in the background
[someObj readTagWithObserver:self];
// return now and at some point someObj will call tagFetched to let us know the work is complete
}
- (void)tagFetched:(NSString *)tag {
// The tag read has finished and we can now continue
}
@end
Тогда ваша функция readTag будет изменена следующим образом:
- (void)readTagWithObserver:(id)observer {
...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
...
dispatch_async(dispatch_get_main_queue(), ^{
if (tag is ok) {
[observer tagFetched:tag];
}
});
});
}
Основная идея заключается в том, что вам нужно разделить обработку на два этапа
- запрос на выполнение некоторой работы (fetchTag в моем примере)
- обработать результат после его завершения (tagFetched: в моем примере)