0

我最近使用 iOS 7 上的新 NSURLSession 完成了我的第一个项目。

我构建了一个应用程序来探索 NSURLSession 的整个 API,实现各种任务: - 数据任务 - 下载任务 - 上传任务

我还使用后台会话实现了后台上传。经过数小时的调试和反复试验,我终于达到了整个应用程序可以正常工作的地步——对我来说就是这样。我将它发布给少数测试人员(< 5),其中一些人遇到了一个我似乎无法重现甚至无法追踪的错误。

我的代码的某个部分 - 在一些不相关的操作之后 - 负责恢复后台会话中可用的当前上传任务:

    [[appDelegate getNSURLSessionForBackgroundTransfers] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
    for(NSURLSessionUploadTask *task in uploadTasks) {
        [task resume];
    }

有时,该应用程序在我的日志中崩溃并出现以下异常(我正在使用曲棍球应用程序):

SIGSEGV

在:

0   libdispatch.dylib                   0x3ba87772 _dispatch_async_f + 10
1   CFNetwork                           0x30a5b86f -[__NSCFBackgroundSessionTask _onqueue_connection_resume] + 92
2   Memoir Beta                         0x00231e85 __55-[PhotoBinariesUploader runCodeEvenIfBackgroundMode:]_block_invoke_3 (PhotoBinariesUploader.m:553)
3   CFNetwork                           0x30a848c5 __50-[__NSCFURLSession getTasksWithCompletionHandler:]_block_invoke246 + 14

有任何想法吗 ?关于它可能是什么的任何提示?

提前致谢!泽

4

1 回答 1

4

从 iOS 7.1 开始,我已经看到了同样的问题。如果您在状态为 NSURLSessionTaskStateCompleted 的任务上调用 resume(也可能是 NSURLSessionTaskStateCanceling),则会发生崩溃。我认为这是 iOS 7.1 中引入的错误,因为在 iOS 7 下,简历被忽略了。

我所做的是以下内容:

  if (task.state == NSURLSessionTaskStateSuspended) {
    [task resume];
  }

这应该可以防止崩溃的发生。无论如何,只有暂停的任务才能恢复。

它仍然令人沮丧,因为它在 iOS 7 下运行了几个月都没有出现问题,而现在发布的应用程序因此会产生很多崩溃。

于 2014-03-18T12:43:53.767 回答