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 传递完成处理程序并从被调用的函数调用它?
是的,在实例变量中保存完成处理程序块:
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)
| 归档时间: |
|
| 查看次数: |
841 次 |
| 最近记录: |