0

キュー関数に問題があります。関数を実行したいのですが、最初の関数の実行が終了したら、別の関数を開始したいと考えています。

-(void)firstFunct
{

// sending and getting information from server.
// doing sth and creating data to use in my second function.

} 

私の2番目の機能は次のとおりです。

-(void)secondFunct
{
// using data coming from first function

}

私は今、これらの2つの機能をそのように使用しています

-(void)ThirdFunct
{

   [self firstFunct];

   [self performSelector:@selector(secondFunct) withObject:nil afterDelay:0.5];


}

しかし、この方法は使いにくいという問題があります。関数を次々に実行する効率的な方法があるかどうかを知りたいです。

4

4 に答える 4

4

関数を次々に呼び出すだけです。

- (void) thirdFunct
{
    [self firstFunct];
    [self secondFunct];
}

このブロック全体をバックグラウンドで実行し、UI スレッドをブロックしない場合は、Grand Central Dispatch を使用します。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{
    [self firstFunct];
    [self secondFunct];
});

また、最初の関数に非同期呼び出しが含まれている場合、その呼び出しは、デリゲート呼び出しや完了ブロックなど、呼び出しの終了後にコードを実行するための何らかのインターフェイスを提供する必要があります。

于 2012-08-25T15:20:02.803 に答える
4

ええ、そうです、通常のケースでは zoul のスポットです。

ただし、サーバーが関与していると述べました。その場合、おそらく非同期リクエストがあります。あなたがしたいことは、ネットワーク要求を行うために使用するクラスのドキュメントを読み、完了時に通知するために使用するコールバックを学ぶことです。

于 2012-08-25T15:23:56.880 に答える
3

Cocoa は、 や などの優れた同時実行管理クラスを提供しNSOperationますNSOperationQueue。これらを使用して、作業 2 の完了後にメソッド 3 を呼び出し、作業 1 の完了後にメソッド 2 を呼び出すコードで明示的な接続を作成せずに、非同期呼び出しの連鎖の背後にあるロジックを簡素化することができます。依存関係管理を使用すると、操作間の依存関係を簡単に指定できます。

そのコードをどのように使用するかの簡単な例を次に示します。これら 3 つのメソッドすべてでデータを非同期的にダウンロードし、 というNSOperationサブクラスを作成したとしますDownloadOperation

まず、 を作成しNSOperationQueueます。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

次に、3 つのダウンロード操作を作成します。

DownloadOperation *a = [[DownloadOperation alloc] init];
DownloadOperation *b = [[DownloadOperation alloc] init];
DownloadOperation *c = [[DownloadOperation alloc] init];

次に、操作間の依存関係を指定します。依存関係は、依存するすべての操作が完了した場合にのみ操作を実行できることを意味します。あなたの例では、依存関係は次のようc <- b <- aになります。これは、2 つのステップに分けることができます。

[b addDependency:a];
[c addDependency:b];

これらの操作をキューに追加します。

[queue addOperations:@[ a, b, c ] waitUntilFinished:NO];

この時点で、キューはすべての操作の処理を自動的に開始しますが、この連鎖的な依存関係を作成したため、特定の例では、それらは次々に実行されます。

https://github.com/AnuragMishra/ChainedOperationQueueの簡単な例でそれを示すサンプル プロジェクトを github で作成しました。タイマーを作成して非同期操作を偽装し、タイマーが終了すると、操作は完了としてマークされます。Xcode 4.5 を使用して記述されているため、古いバージョンでのコンパイルに問題がある場合はお知らせください。

于 2012-08-26T20:54:08.797 に答える
-2

このようにメソッドを書くと

-

(void)ThirdFunct
{

   [self firstFunct];

   [self secondFunct];


}

secondFunctの後に呼び出されfirstFunctます。あなたの問題は、非同期のネットワーク要求から確実に発生します。非同期リクエストの後に確実secondFunctに実行するには、デリゲートまたはブロックから実行する必要があります。NSURLConnectionDelegateをチェックアウトする場合NSURLConnection

于 2012-08-25T15:21:36.450 に答える