1

インターネット経由で非同期クエリを実行するためのさまざまな種類の操作 (NSOperation から派生) があります。通常どおり、isFinished プロパティを観察することで、いつ終了するかを判断します。

特定の種類の操作が終了したら、最初の情報を使用して次の種類の操作を作成したいと考えています。しかし、そうすると、操作で addObserver を呼び出すと、アプリがクラッシュし、アクセスが悪くなります。オブザーバーはランダムなスレッドで呼び出されるので、フォローアップ操作を作成し、オブザーバーをメインスレッドに設定してみました。変わりはない。これは、observeValueForKeyPath で行われています。

GetMessagesOperation* msgOp = 
  [[GetMessagesOperation alloc] initWithUserID:_user.getID()
                                     sinceLast:true
                                 includeSystem:true
                                   includeUser:false
                                      skipRows:0
                                      maxCount:50
                                     DBManager:_pDatabaseMgr];
[msgOp addObserver:self 
        forKeyPath:@"isFinished"
           options:0
           context:getMessageContext];
[_operationQueue addOperation:msgOp];
[msgOp release];

コンテキストは文字列への void* です。私は、正常に動作する他の多くの操作に同じ構文を使用しています。コンテキストの定義方法は次のとおりです。

static void* systemInfoContext = (void*)@"sys";
static void* validateUserContext = (void*)@"user";
static void* getMessageContext = (void*)@"msg";

ここで推測できる人はいますか?ありがとう!

編集:返信ありがとうございます。クラッシュ ログは生成されません。addObserver 行で不正なアクセスが発生して終了するだけです。これは、observerValueForKeyPath が入力されたメイン スレッドまたはバックグラウンド スレッドのどちらで実行するかに関係なく発生します。

4

1 に答える 1

0

ばあ!全体の問題は、オペレーションの初期化メソッドで [super init] を呼び出せなかったことです。

とにかく答えてくれたすべての人に感謝します。

于 2012-01-14T22:48:07.757 に答える