将完成处理程序传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ShellExecute 从 VBScript 将参数传递给批处理文件 [重复]

如何将参数传递给快速完成的函数

将参数传递给 AsyncTask,并返回结果

将额外参数传递给事件处理程序?

如何将事件和其他参数传递给单击处理程序

如何将自定义参数传递给事件处理程序