3

基本クラスには見られない機能を追加するための操作フレームワークを作成しました (成功/失敗の追跡など)。親操作は通常非並行であり、子操作を管理するためだけに存在する場合があります。通常は同時実行される子操作 (xml とメディアの非同期ダウンロード)。

iOS 7 でアプリケーションを実行すると、多くの操作が操作キューに追加され、操作の約 3/4 が完了すると、アプリがハングしたように見えます。

デバッガーでアプリを一時停止し、キュー (sOpQueue.operations) 内の操作を調べると、それらの多くは実行する準備ができています (isReady は TRUE を返します) が、明らかにそれらのどれも実行されていません (isExecuting は FALSE を返し、私はスレッドで実行されている操作の証拠はありません)。

これは、iOS 7 以降の新しい問題です。

同時操作の数を増減しても、動作は変わらないようです。

準備完了操作が開始されていない理由を特定する方法について、誰か提案はありますか?

ありがとう、チャック

4

2 に答える 2

5

isReady Key Value Observing通知を発行していますか?

たとえば、次のプロパティを使用します。

@property (nonatomic, getter = isReady) BOOL ready;

そして、カスタム セッターを用意します。

- (void)setReady:(BOOL)ready
{
    [self willChangeValueForKey:@"isReady"];
    _ready = ready;
    [self didChangeValueForKey:@"isReady"];
}

を呼び出すカスタムゲッターと同様にsuper

- (BOOL)isReady
{
    return _ready && [super isReady];
}

また、setter と getter の両方を実装したため、最初にプロパティを手動で合成する必要があり@implementationます (通常はこれ以上行う必要はありませんが、すべてのカスタム アクセサーを実装する場合は、手動で合成する必要があります@synthesize) 。 :

@synthesize ready = _ready;

そして、以下の両方の条件が満たされると、操作が開始されます。

  • readyプロパティは次のように設定されますYES(ivar を直接使用するのではなく、setter を使用することに注意してください)。

    self.ready = YES;
    

    また

    [self setReady:YES];
    
  • 他のすべての標準NSOperation基準が満たされています (たとえば、操作間の依存関係、尊重maxConcurrentOperationCount、優先度の因数分解など)。

于 2013-10-08T20:43:58.723 に答える