インターネット経由で非同期クエリを実行するためのさまざまな種類の操作 (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 が入力されたメイン スレッドまたはバックグラウンド スレッドのどちらで実行するかに関係なく発生します。