将完成处理程序传递给 NSTimer
Posted
技术标签:
【中文标题】将完成处理程序传递给 NSTimer【英文标题】:Pass completionHandler to NSTimer 【发布时间】:2014-08-01 13:38:27 【问题描述】:在 ios 7 中,他们添加了 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
功能,它允许您在收到推送通知时在后台执行某些操作。然而,他们只给你大约 30 秒的时间来做某事。
我想制作一个 NSTimer,让我知道我的 30 秒是否快到了,并让它完成它正在做的事情。通过计时器传递完成处理程序会很好,这样我可以在完成后调用它。
有没有办法通过 NSTimer 传递完成处理程序 (void (^)(UIBackgroundFetchResult))completionHandler
并从被调用函数中调用它?
【问题讨论】:
【参考方案1】:是的,将完成处理程序块保存在实例变量中:
typedef void(^BackgroundCompletionHandler)(UIBackgroundFetchResult);
@interface YourClass ()
BackgroundCompletionHandler _backgroundCompletionHandler;
并使用通用方法调用这个存储块:
-(void) application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(BackgroundCompletionHandler)completionHandler
_backgroundCompletionHandler = completionHandler;
[NSTimer scheduledTimerWithTimeInterval:30.0
target:self
selector:@selector(timeUp:)
userInfo:nil
repeats:NO];
// Do work
[self callBackgroundCompletionHandler:YES];
- (void)timeUp:(NSTimer *)timer
[self callBackgroundCompletionHandler:NO];
- (void)callBackgroundCompletionHandler:(BOOL)succeeded
@synchronized(self)
if (_backgrondCompletionHandler)
_backgroundCompletionHandler(succeeded ? UIBackgroundFetchResultNewData : UIBackgroundFetchResultFailed);
_backgroundCompletionHandler = NULL;
【讨论】:
(void (^)(UIBackgroundFetchResult)) _backgroundCompletionHandler;
行出现错误。它说预期的成员名称或“;”在声明说明符之后
@Kevin 道歉;我已经编辑了答案以使用typedef
使块的使用更容易。以上是关于将完成处理程序传递给 NSTimer的主要内容,如果未能解决你的问题,请参考以下文章