iPad应用程序在NSOperationQueue期间冻结

时间:2012-05-22 09:27:29

标签: objective-c ios nsoperationqueue

我在使用NSOperationQueue的应用程序时遇到问题。 似乎按下iPad的关闭按钮会使U​​I冻结。应用程序本身仍然在后台运行,UI已更新,只是它不再应对触摸或旋转,并且它不会被关闭。

我有一个更新模块,可下载相当长的xml文件列表并将其保存在设备上。操作队列的MaxConcurentOperations值为2。 通常一切正常,应用程序运行良好和花花公子,响应我的触摸和旋转直到我按下设备的按钮。在此之后,UI只是冻结。进度仍然更新(UILabel),仍会显示重复的动画,但在完成所有操作之前,应用程序才会关闭。

我没有在我的队列上调用waitUntilAllOperationsAreFinished,所以我不知道是什么原因造成这种情况。到目前为止,我只在iOs 5.0的第一代iPad上进行了测试

如果有人能提供一些提示,我会非常感激。如果有必要,我可以发布NSOperationQueue和NSOperation类代码,但不知何故,我感觉这是关于我错误地接近这个,而不是关于错误的代码行

[编辑] 我还使用计时器定期检查下载状态,但我注意到没有调用计时器并没有消除问题

  

self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(xmlDownloaded)userInfo:nil repeats:YES];

[EDIT2] 在进行了一些进一步的研究之后,我确保我的操作是并发的,只是为了确保,我改变了将操作添加到队列的方式。 而不是

  

[downloadQueue addOperation:op];

我将它们添加到一个名为“operations”的可变数组中,最后我使用了

  

[downloadQueue addOperations:operations waitUntilFinished:NO];

但是当我按下关闭按钮时,我的应用程序仍会冻结...

2 个答案:

答案 0 :(得分:1)

疯狂猜测,您是在锁定主线程等待您的操作完成/您是否正在viewWillDisappear销毁您的操作代理?

答案 1 :(得分:0)

似乎有另一个功能导致这种情况,即使我不明白为什么......

我有一个标签动画

  

CABasicAnimation * fadey = [CABasicAnimation animationWithKeyPath:@“opacity”];

     

[fadey setToValue:[NSNumber numberWithFloat:0.35f]];

     

fadey.repeatCount = HUGE_VALF;

     

[fadey setAutoreverses:YES];

     

[fadey setDuration:0.6f];

这个小功能导致应用程序等待所有操作完成以关闭应用程序。奇怪的是,功能甚至没有用NSOperations调用,而是在它们之前调用 再一次,我不知道为什么......当我按下关闭按钮时,一切都会中断,否则没有问题。因此,如果其他人遇到类似的问题,可能有助于检查一些重复的动画