我正在创建一个在后台模式下工作的应用程序(最小化),它每 90 秒执行一次检查服务器上某些信息的特定方法。代码是这样的:
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
...
}
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
MyFristViewController *viewController = (MyFristViewController *)self.window.rootViewController;
[viewController checkData:^(UIBackgroundFetchResult result) {
completionHandler(result);
}];
}
MyFristViewController.m
-(void)checkData:(void (^)(UIBackgroundFetchResult))completionHandler{
...
NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil){
completionHandler(UIBackgroundFetchResultNewData);
}else{
completionHandler(UIBackgroundFetchResultNoData);
}
}];
[dataTask resume];
[self performSelector:@selector(checkData:) withObject:nil afterDelay:90.0];
...
}
我的代码运行良好,但正如我之前所说,一个命令必须每 90 秒运行几次,为此,该方法的结尾使用了这个更有效的命令:
[self performSelector:@selector(checkData:) withObject:nil afterDelay:90.0];
这段代码的问题是它第一次运行完美,现在当他期望 90 秒并第二次运行相同的代码时,我收到错误消息EXEC_BAD_ACCESS这行代码:
completionHandler(UIBackgroundFetchResultNewData);
现在,如果我删除这行代码,我会收到消息并且我的应用程序运行良好(没有任何崩溃):
应用程序委托收到了对 -application:performFetchWithCompletionHandler: 的调用,但从未调用过完成处理程序。
我认为收到此消息并不好,简而言之,我想要做的是在应用程序最小化时永远每 90 秒运行一次此命令。我做得对吗?