【问题标题】:Pass completionHandler to NSTimer将完成处理程序传递给 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 并从被调用函数中调用它?

【问题讨论】:

    标签: ios push-notification nstimer


    【解决方案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 使块的使用更容易。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多