Блок иногда называют анонимными функциями. Зачем? потому что у них нет четкого однозначно определенного имени (они анонимные) и действительно различают только их подпись (входные параметры и их вывод).
Так что в вашем случае не обязательно, чтобы ваш блок определялся глобально. Потому что, когда вы вызовете -(void)getStatusUpdate:completionHandler:
в каком-либо другом классе, вы просто создадите блок, который будет иметь одну и ту же подпись вместе с реализацией блока и передать его в качестве параметра.
Это будет выглядеть следующим образом (обратите внимание на переменном экземпляре блока ушел):
@interface GetStatusUpdate : NSObject
-(void)getStatusUpdate:(NSDictionary*)details
completionHandler:(void (^)(UIBackgroundFetchResult *result))paramCompletionHandlerBlock;
@end
и вызов метода в каком-нибудь другом классе (где statusUpdateInstance является экземпляром класса GetStatusUpdate), как это:
[statusUpdateInstance getStatusUpdate:detailsDictionaryInstance
completionHandler:^(UIBackgroundFetchResult *result)
{
//code that processes "result"...
}];
КПП. Я исправил подпись блоков, входной параметр должен быть назван.
Для обсуждения объема блоков (есть она более глобальна, как вы говорите), чтобы сделать какой-либо смысл, вам нужно ЬурейеГо блока. Это не будет «анонимным» больше, поскольку он будет известен как отдельный тип.
Где подходящее место для typedef блока? Ну, любой класс, который хочет вызвать метод -(void)getStatusUpdate:completionHandler:
, должен импортировать класс GetStatusUpdate
.Только классы, которые называют этот метод, действительно должны знать блок, а не другие.
Таким образом, имеет смысл объявить и напечатать этот блок в открытом интерфейсе класса GetStatusUpdate
. Дадим блока имени FetchResultsCompletionBlock
, потому что это то, что блок действительно, и это будет выглядеть следующим образом>
typedef void(^FetchResultsCompletionBlock)(UIBackgroundFetchResult *result);
@interface GetStatusUpdate : NSObject
-(void)getStatusUpdate:(NSDictionary*)details completionHandler:(FetchResultsCompletionBlock)completionHandle;
@end
Обратите внимание, что когда-то этот блок ЬурейеЙ-й изд т.е. представляет собой отчетливый известный тип
THI подпись метода -(void)getStatusUpdate:completionHandler:
значительно упрощена.
http://stackoverflow.com/questions/7294176/how-to-create-global-functions-in-objective-c – Chase
Правильным заголовком для этого вопроса будет «Как объявить переменную экземпляра типа блока? " Это не «глобальный», не функциональный указатель. –