后台内部延迟提取EXC_BAD_ACCESS

时间:2015-02-16 22:44:30

标签: ios objective-c nsurlsession background-fetch

我正在创建一个在后台模式下工作的应用程序(最小化),并且每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秒永远运行此命令。我正在以正确的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

你无法在后台永远奔跑,iOS也无法为你提供这种能力。

目前的崩溃是因为你多次调用完成处理程序并且在它被无效之后。

基本上,你应该改变你的方法,也许你的要求,并使用Apple规定的后台处理(因此基于用户使用而不是明确的时间段)。

答案 1 :(得分:0)

Wain是正确的。 您的方法基本上与Apple关于背景和服务的愿景相反。

更好的是服务器完成工作并最终发送推送(无声)通知。