2015-02-25 2 views
1

Я хочу, чтобы глобально объявить указатель функции в Objective C. Я хочу сделать это, потому что я получаю асинхронные обновления для уведомления, и я хотел бы, чтобы обработчик завершения был использован как только все обновления будут получены.Глобальное объявление указателя функции в Objective C

Заголовок объявляется следующим образом:

@interface GetStatusUpdate : NSObject 
{ 
    void (^)(UIBackgroundFetchResult) completionHandler;  
} 

-(void)getStatusUpdate:(NSDictionary*)details completionHandler:(void (^)(UIBackgroundFetchResult))completionHandle; 

@end 

Я счастлив (я думаю), что я передаю обработчик завершения правильно getStatusUpdate, но заявление «недействительным (^) (UIBackgroundFetchResult) completionHandler "не компилируется.

В интересах полноты, я собирался:

-(void)getStatusUpdate:(NSDictionary*)journeyDetails 
    completionHandler:(void (^)(UIBackgroundFetchResult))completionHandle { 

    completionHandler = completionHandle; 
} 

Любая идея, что я делаю неправильно здесь? Любые предложения, как я мог бы использовать обработчик завершения «лучше» после асинхронной выборки?

+0

http://stackoverflow.com/questions/7294176/how-to-create-global-functions-in-objective-c – Chase

+2

Правильным заголовком для этого вопроса будет «Как объявить переменную экземпляра типа блока? " Это не «глобальный», не функциональный указатель. –

ответ

2

имя находится в неправильном месте:

@interface GetStatusUpdate : NSObject 
{ 
    void (^completionHandler)(UIBackgroundFetchResult);  
} 

Затем, некоторые, где вы должны определить блок:

completionHandler = ^(UIBackgroundFetchResult result) { 
    // do your work 
}; 

или назначить его, как вы делали.

Я считаю, это полезно, когда приходится работать с блоками: http://fuckingblocksyntax.com/

Как и в сторону, ваш блок хранится в переменной экземпляра, не глобальной переменной.

2

Блок иногда называют анонимными функциями. Зачем? потому что у них нет четкого однозначно определенного имени (они анонимные) и действительно различают только их подпись (входные параметры и их вывод).

Так что в вашем случае не обязательно, чтобы ваш блок определялся глобально. Потому что, когда вы вызовете -(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: значительно упрощена.

Смежные вопросы