0

NSOperationQueueを実装したアプリに問題があります。iPadの閉じるボタンを押すとUIがフリーズするようです。アプリ自体はまだバックグラウンドで実行されており、UIが更新されています。タッチや回転に応答しなくなり、本来のように閉じられなくなります。

非常に長いxmlファイルのリストをダウンロードしてデバイスに保存する更新モジュールがあります。操作キューのMaxConcurentOperations値は2です。通常、すべてが正常に機能し、アプリは正常に動作し、デバイスのボタンを押すまで、タッチと回転に応答します。この後、UIは単にフリーズします。進行状況は引き続き更新され(UILabel)、繰り返しのアニメーションは引き続き表示されますが、すべての操作が完了するまでアプリは閉じられません。

キューでwaitUntilAllOperationsAreFinishedを呼び出していないので、これが何を引き起こしているのかわかりません。これまでのところ、iOs5.0を搭載した第1世代のiPadでのみテストを行っています。

誰かが私にいくつかのヒントを提供してくれるなら、私はそれを本当に感謝します。必要に応じて、NSOperationQueueおよびNSOperationクラスコードを投稿できますが、コードの行の誤りではなく、これに誤ってアプローチしていることをどういうわけか感じています。

[編集]タイマーを使ってダウンロード状況を定期的にチェックしていますが、タイマーを呼び出さなくても問題が解決しないことに気づきました

self.timer = [NSTimercheduledTimerWithTimeInterval:2.0 target:selfセレクター:@selector(xmlDownloaded)userInfo:nil repeats:YES];

[edit2]さらに調査した後、操作が並行していることを確認しました。念のため、操作をキューに追加する方法を変更しました。それ以外の

[downloadQueue addOperation:op];

それらを「operations」と呼ばれる可変配列に追加し、最終的に使用しました

[downloadQueue addOperations:operations waitUntilFinished:NO];

しかし、閉じるボタンを押すとアプリがフリーズします...

4

2 に答える 2

1

ワイルドな推測ですが、操作が完了するのを待ってメインスレッドをロックしています/操作デリゲートを破棄していますviewWillDisappearか?

于 2012-05-22T10:05:36.530 に答える
0

理由はわかりませんが、これを引き起こしている別の機能があったようです...

ラベルアニメーションがありました

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

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

およびfady.repeatCount=HUGE_VALF;

[fadey setAutoreverses:YES];

[fadey setDuration:0.6f];

この小さな関数により、アプリを閉じるためにすべての操作が終了するまでアプリが待機していました。奇妙な部分は、関数がNSOperationsで呼び出されなかったことですが、その前に、理由がわかりません...閉じるボタンを押すとすべてが壊れます。それ以外の場合は問題ありません。したがって、他の誰かが同様の問題に遭遇した場合は、繰り返しアニメーションをチェックすることが役立つ場合があります

于 2012-05-22T14:29:56.917 に答える