后台获取延迟 EXEC_BAD_ACCESS
Delay inside Background Fetch EXEC_BAD_ACCESS
我正在创建一个在后台模式(最小化)下工作的应用程序,它每 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 delegate received call to
-application:performFetchWithCompletionHandler: but the completion handler was never called.
我认为收到此消息并不好,简而言之,我想做的是 运行 在应用程序最小化时,此命令永远每隔 90 秒执行一次。我做的对吗?
你不能 运行 永远在后台,iOS 只是没有给你那种能力。
当前的崩溃是因为您多次调用完成处理程序并且在它已失效之后。
基本上,你应该改变你的方法,也许你的要求,并使用 Apple 规定的后台处理(因此基于用户使用而不是明确的时间段)。
韦恩是正确的。
你的做法基本上与苹果对背景和服务的看法相反。
如果服务器完成工作并最终发送推送(静默)通知会更好。
我正在创建一个在后台模式(最小化)下工作的应用程序,它每 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 delegate received call to -application:performFetchWithCompletionHandler: but the completion handler was never called.
我认为收到此消息并不好,简而言之,我想做的是 运行 在应用程序最小化时,此命令永远每隔 90 秒执行一次。我做的对吗?
你不能 运行 永远在后台,iOS 只是没有给你那种能力。
当前的崩溃是因为您多次调用完成处理程序并且在它已失效之后。
基本上,你应该改变你的方法,也许你的要求,并使用 Apple 规定的后台处理(因此基于用户使用而不是明确的时间段)。
韦恩是正确的。 你的做法基本上与苹果对背景和服务的看法相反。
如果服务器完成工作并最终发送推送(静默)通知会更好。