1

ネットワークメッセージがコールバックメソッドを開始するとします。

- (void)didReceiveNetworkMessage {
  [obj respondToMethod];
}

- (void)myBigMethod {
  [obj mySmallMethod1];
  [obj mySmallMethod2];
  /* network message received now */
  [obj mySmallMethod3];
  [obj mySmallMethod4];
}

objシングルスレッド環境で呼び出されるメソッドはどのような順序で実行されますか?

4

4 に答える 4

2

上記のすべてがメインスレッド上にあると仮定すると、didReceiveNetworkMessageメソッドが処理される前に、myBigMethodの実行が終了します(したがって、mySmallMethod4が呼び出されます)。

コールバックは、バックグラウンド作業(つまり、ネットワークのロード)が完了した後に実行されるため、通常はメインスレッドで実行されます。特にコーディングしていない限り、通常はすべてメインスレッドで行われます。

于 2013-02-23T19:15:24.643 に答える
1

更新:更新された質問が与えられた場合、すべてが同じスレッドで実行respondToMethodされると、実行後に呼び出さmyBigMethodれます。

didReceiveNetworkMessage複数のスレッドが関係している場合、メソッドとは異なるスレッドでが呼び出されると仮定すると、次のmyBigMethodように表示されます。

mySmallMethod1
mySmallMethod2
mySmallMethod3
mySmallMethod4

respondToMethod実行開始中またはそれ以降はいつでも呼び出すことができますmySmallMethod2

つまり、、、、または実行respondToMethodされた後でも実行される可能性があります。mySmallMethod2mySmallMethod3mySmallMethod4mySmallMethod4

于 2013-02-23T19:14:45.907 に答える
0

同じスレッド、同じキュー、または同じキューを対象とするキューにないメソッドは、相互に未定義の順序になっています。それぞれの個別の指示は、同時にを含め、他の間にいつでも発生する可能性があります。

メソッドがそのようなシリアル化されたコンテキストで実行されている場合、順序はどちらが最初に開始されたかによって異なります。ただし、メソッドの開始にも同じ懸念が当てはまるため、順序も未定義です。

于 2013-02-23T19:18:09.677 に答える
-1

これは、すべてがスタックヒープにどのようにプッシュされるかによって異なります。あなたが最善の策は、あなたがスタックしているのを見て(メッセージを印刷して)、それを理解することです。ヒープは実行の順序を定義します。遅延に問題がある場合は、ヒープの順序を操作することでおそらく修正されます。同時に実行するものが必要な場合は、マルチスレッド化とブロックコードのトスが役立つはずです。

- (void)didReceiveNetworkMessage {
  [obj respondToMethod];
}

- (void)myBigMethod {
  [obj mySmallMethod1];
  [obj mySmallMethod2];
  /* network message received now */
  [obj mySmallMethod3];
  [obj mySmallMethod4];
}

上記のコードと上記の参照から、respondToMethod、mySmallMethod1、2、3、4がこの順序で呼び出されているように見えます。

上記の情報(実際にこれらのメソッドを呼び出しているメッセージと場所を含む)が完全に不足していることを明確にする必要があると思います。その情報がなければ、私の答えは正しいと言えます。なぜ私がそれに投票されたのか分かりません。mySmallMethod3の前とmySmallMethod2の後にrespondToMethodからコールバックを受け取ることを前提として、メソッドが呼び出されて実行される順序を説明しました。これは、上記の例で述べたものです。より良い答えが必要な場合は、より明確な例を提供してください。

于 2013-02-23T19:11:05.770 に答える