1

私はiphoneアプリを持っており、View Controllerのロード時に、Webサービスを呼び出し、すべてのバックグラウンドスレッドでXMLを取得して解析したいと考えています。次に、スレッドの完了後にUIを更新し、別のスレッドを起動して、別のバックグラウンドスレッドで2番目の操作を実行します。

スレッド呼び出しを連鎖させるようなものです。

  1. UIスレッド->BGスレッドの作成
  2. BGスレッド->XMLサービスを呼び出して結果を取得する
  3. UIスレッド->BGスレッド操作の成功のUIを更新します
  4. BGスレッド->操作のパート2を発射します

すべてアプリのロード時に。

問題は、私の最初のBGスレッド操作が決して終了しないように見えることです。手順2が完了した後、何が起こっているかを確認するために電話を追加しましたがwaitUntilAllOperationsAreFinished、アプリがそのポイントを超えることはありません。

これは一種の基本的なスケルトン実装です。

- (void) viewDidLoad 
{
    queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];

    //other stuff

    [self loadFriendsInBackgroundThread];
}

- (void) loadFriendsInBackgroundThread
{   
    NSInvocationOperation *operation = [NSInvocationOperation alloc];
    operation = [operation initWithTarget:self selector:@selector(invokeLoadingOfFriends:) object: nil];

    [queue addOperation:operation];
[operation release];
}

- (void) invokeLoadingOfFriends: (id) obj
{
    //webservice calls and results

    [self performSelectorOnMainThread:@selector(invokeRefreshAfterLoadingFriends:) 
                       withObject:nil 
                    waitUntilDone:YES];
}

- (void) invokeRefreshAfterLoadingFriends: (id) obj
{
    //this line is where is hangs
    [queue waitUntilAllOperationsAreFinished];

    //never gets here
    [self refresh: NO];
}

最初のスレッド呼び出しが決して終了しないように見える理由についてのアイデアはありますか?

あなたがマークを与えることができるどんな助けにも感謝します

4

1 に答える 1

2

ここでは、呼び出されたメソッドが完了するまで待機するメイン スレッドでメソッドを呼び出しています ( waitUntilDone:YES)。

[self performSelectorOnMainThread:@selector(invokeRefreshAfterLoadingFriends:) 
                   withObject:nil 
                waitUntilDone:YES];

-invokeRefreshAfterLoadingFriends:次に、操作が終了するまでメインスレッドを保持する呼び出しを行うため、メソッドが「完了」することはありません。のドキュメントから-waitUntilAllOperationsAreFinished:

このメソッドが呼び出されると、現在のスレッドがブロックされ、レシーバーの現在の操作とキューに入れられた操作の実行が完了するまで待機します。

その結果、-invokeLoadingOfFriends:操作メソッドはメイン スレッドのメソッドが終了するのを待っています[queue waitUntilAllOperationsAreFinished]

に設定waitUntilDoneしてみNOて、これが操作の完了に役立つかどうかを確認してください。

于 2010-07-29T10:47:21.103 に答える