将completionHandler传递给NSTimer

Kev*_*vin 2 nstimer push-notification ios

在iOS 7中,他们添加了一个功能-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler,允许您在获得推送通知时在后台执行某些操作.然而,他们只给你约30秒的时间做某事.

我想制作一个NSTimer让我知道如果我的30秒差不多了,并完成它正在做的事情.通过计时器传递完成处理程序会很好,这样我就可以在完成后调用它.

有没有办法通过(void (^)(UIBackgroundFetchResult))completionHandlerNSTimer 传递完成处理程序并从被调用的函数调用它?

Dro*_*ppy 6

是的,在实例变量中保存完成处理程序块:

typedef void(^BackgroundCompletionHandler)(UIBackgroundFetchResult);

@interface YourClass ()
{
    BackgroundCompletionHandler _backgroundCompletionHandler;
}
Run Code Online (Sandbox Code Playgroud)

并使用常用方法调用此存储块:

-(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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)