1

私はiOS4から動作するiOSプロジェクトに取り組んでいます。私はNSOperationQueueを持って、私は操作を追加します。主な操作方法は次のようになります。NSOperation内のブロックを持つメソッド - どのように機能しますか?

ブロック内のコードは、getStuffが成功または失敗を呼び出すときにのみ呼び出されます。私はその間、私の操作はNSOperationQueueから削除され、ブロックは呼び出されないと考えました。しかし、私はそれをテストし、ブロックは実際に呼び出されました。これは、クライアントがdispatch_get_main_queueまたはそのスレッドを呼び出したスレッド(この場合は上記の操作)のsuccessブロックを呼び出すかどうかは関係なく呼び出されます。

ブロックが呼び出される前に、isFinishedメソッドが実際にtrueを返す(私はisFinishedメソッドをオーバーライドして値をチェックした)ので、ブロックが呼び出される可能性があることを誰かが説明できますか?

これは私が数百回の反復のサイクルでそれを追加するとき、私はEXC_BAD_ACCESSを取得し、上記の理解はデバッグに私を助けるかもしれない、1つのコールのために正常に動作しますが、ので、私はこのすべてを求めています。

+0

getStuffSuccessは、同期同期または非同期ですか? – jsd

+0

これは非同期です。 – Adriana

答えて

0

-getStuffSuccess:failureがスレッドをブロックしない(つまり、メソッドが非同期である)場合は、-mainが完了し、successQueueが成功または失敗ブロックが呼び出される前にオペレーションの割り当てを解除することがあります。あなたは追加することにより、スレッドをブロックすることができます

while(notProcessed){ 
    sleep(0.1); 
    //Make sure your success and failure functions update notProcessed BOOL 
} 

あなたはクロージャを呼び出すための機会を持っていた前mainが完了したことがないようにします。または、同期メソッドを使用します。これは、あなたがUIスレッド上にとどまることはないため、一般的には問題ありません。

+0

このような状況では、同時に実行する必要があります(-main以外の-startメソッドと他のKVOのもの...上記の私の応答を参照してください) – jsd

+0

クール、ありがとう。これが問題であれば、jsdの答えははるかに正確で非ハッキリの解決策を提供します。 また、[asynchronous-methods-in-nisperation](http://stackoverflow.com/questions/1596160/asynchronous-methods-in-nsoperation) – waggles

1

ブロック内のコードは、getStuffが成功または失敗を呼び出すときにのみ呼び出されます。私はその間、私の操作はNSOperationQueueから削除され、ブロックは呼び出されないと考えました。

あなたはこれを信じています。ブロックはクロージャであり、自己完結型のコードブロックです。存在するためには、他のオブジェクト(この場合はNSOperation)の存在に依存しません。 は、他のオブジェクトに依存することをが望んでいるかもしれませんが、それはあなたが実行するまでです。理想的には、getStufSuccess:failure:synchronousを作成します。できない場合は、NSConditionを使用するか、NSRunLoopメソッドを呼び出して、スレッドが完了するまで安価にブロックします。

ここでもスレッドの安全性を考慮する必要があります。あなたの問題は、操作がなくなることとは関係ないかもしれませんが、あなたのブロックはスレッドセーフではない何かをしています。

関連する問題