【问题标题】:iPad app freezes during NSOperationQueueiPad 应用程序在 NSOperationQueue 期间冻结
【发布时间】:2012-05-22 09:27:28
【问题描述】:

我在实现 NSOperationQueue 的应用程序中遇到问题。 似乎按下 iPad 的关闭按钮会使 UI 冻结。应用程序本身仍在后台运行,UI 已更新,只是它不再响应触摸或旋转,也没有按应有的方式关闭。

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

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

如果有人能给我一些建议,我将不胜感激。如有必要,我可以发布 NSOperationQueue 和 NSOperation 类代码,但不知何故,我有这样的感觉:我错误地处理了这个问题,而不是代码行有问题

[编辑] 我也使用定时器来定期检查下载状态,但我注意到不调用定时器并不能消除问题

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

[编辑2] 经过一些进一步的研究,我确保我的操作是并发的,并且为了确定,我改变了将操作添加到队列中的方式。 而不是

[downloadQueue addOperation:op];

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

[downloadQueue addOperations:操作 waitUntilFinished:NO];

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

【问题讨论】:

    标签: objective-c ios nsoperationqueue


    【解决方案1】:

    猜想,您正在锁定主线程等待您的操作完成/您正在销毁viewWillDisappear 上的操作委托?

    【讨论】:

    • 不,我做的唯一类似的事情是取消 dealloc (setSuspended/cancelAllOperations/release) 中的队列并在 Internet 连接断开时将其挂起。另外,我的运营没有委托人
    【解决方案2】:

    似乎有另一个函数导致了这个,尽管我不明白为什么......

    我有一个标签动画

    CABasicAnimation *fadey = [CABasicAnimation animationWithKeyPath:@"opacity"];

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

    fadey.repeatCount = HUGE_VALF;

    [fadey setAutoreverses:YES];

    [fadey setDuration:0.6f];

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

    【讨论】:

      猜你喜欢
      • 2011-08-16
      • 2018-08-02
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多