如果用户导航,NSURLConnection会冻结

时间:2014-07-31 18:21:22

标签: ios objective-c asynchronous nsurlconnection

我有一个带有多个单元格的UITableView,可以包含播放按钮。每个播放按钮都有一个UITapGetsureRecognizer,它调用NSURLConnection来下载音频文件。 NSURLConnection在我的AudioPlayer类中声明,它扩展了NSObject。现在,当用户按下播放时,我们开始下载。下载完成后,我们播放音频。如果用户在下载过程中尝试按下另一个音频文件的播放按钮,我们会成功取消NSURLConnection,将连接设置为nil,并为请求的音频文件打开新连接。这很有效。

当用户按下播放,下载开始,然后用户按下后退按钮(在NavigationBarOverlay上)时,我遇到了问题。这会导致应用程序冻结。我试图在UITableView的viewWillDisappear中添加代码而没有运气。我试图覆盖AudioPlayer函数的dealloc方法 - 没有运气。我已经改变了要使用NSURLConnection指针启动的​​AudioPlayer类的实现(而不是负责分配连接,将责任交给UITableView)

以下是我尝试过的一些例子:

在UITableView

-(void) viewWillDisappear:(BOOL)animated {
    [audioConnection cancel];
    [messagePlayer stop];
}

和AudioPlayer对象内部

-(void) dealloc {
    [self.audioConnection cancel];
}

当我发生冻结时暂停调试器时,调用堆栈如下所示: 线程1

Queue: com.apple.main-thread
0 semaphore_wait_trap
.....................................................
4 +[NSURLConnection sendSynchronousRequest:returningResponse:error:]
5 +[Utilities serviceAvailable]
6 -[MessageViewController backButtonPressed] //Note: this is my UITableView
7 -[ViewController backButtonPress]
8 -[NavigationBarOverLayView backButtonPressed:]
9 _UIGestureReconginzerSendActions

有人有什么想法吗?有没有人知道为什么NSURL sendSynchronousRequest在调用堆栈中。当你启动连接时我想:      self.audioConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

它会异步下载文件。我错了吗?

谢谢。如果您需要更多信息,请与我们联系。

编辑:在iOS 7.1 iPhone 4视网膜模拟器上看起来这个“冻结”的时间超过1分钟。然后它恢复正常功能。为了更具描述性,当用户点击后退按钮时,按钮上会有一个颜色变化,表示它已被按下。在冻结期间,此按钮似乎在整个时间内都被“按下”。

1 个答案:

答案 0 :(得分:0)

我假设sendSynchronousRequest在调用堆栈中的原因是因为异步加载是使用与同步相同的代码实现的,但是在后台线程上调用它。

我知道这并没有回答你的主要问题,但至少它可以解释这一部分!