3

私のアプリケーションでは、NSXMLParser を使用していくつか (6 ~ 10) の Web サイトから情報を読み込み、その情報をビューに読み込みます。

現在、私のアプリケーションはviewDidLoad、メイン ビュー コントローラー内のサイトをループして、作成したバックグラウンド スレッドに各サイトをロードするように設定されています。これはバックグラウンド スレッドで行われるため、ユーザーはビューが読み込まれる前にすべてのサイトが読み込まれるのを待つ必要がありません。

for (NSMutableDictionary *dict in self.sitesArray) {
    SiteData *data = [[SiteData alloc] init];
    [data setDelegate:self];
    dispatch_async(backgroundQueue, ^(void) {
        [data loadSite:[dict objectForKey:@"SiteName"]];
    });

}

SiteData では、NSXMLParser を使用してサイトを読み込みます (すべてのデリゲート メソッドも適切に実装されています)。

-(void)loadSite:(NSString *)site{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[self fullURLForSiteName:site]];
    [parser setDelegate:self];
    [parser parse];
    return;
}

NSXMLParser がドキュメントを終了し、SiteData インスタンスにサイトのデータが入力されると、それ自体がメイン スレッド上のメイン ビュー コントローラーのメソッドに渡されます。

- (void)parserDidEndDocument:(NSXMLParser *)parser{    
    dispatch_async(dispatch_get_main_queue(), ^(void) {
         [delegate successfullyLoadedSite:self];
    });
}

successfullyLoadedSite:渡されたサイトのデータをビューに読み込み、ユーザーに表示します。複数のサイトのデータが同じ画面に表示されることに注意してください。

実現したいこと:ビューが更新されるまですべてのサイトの読み込みが完了するまで待つ必要がないように、読み込み時に各サイトのデータが画面に表示されるようにします。

何が起こっているか:サイトの 1 つが読み込まれて表示され、残りのすべてが読み込まれるのを待たなければならず、残りのすべてが一度に表示されます。

successfullyLoadedSite:コンソール ログから、メイン キューで初めて呼び出すと、すべてがメイン キューで実行されるようです。メイン キューの最初successfullyLoadedSite:のものが呼び出されると、すべてのサイトがオブジェクトに読み込まれ、ビューに読み込まれます。

何が起こっているのですか?私がマルチスレッドに慣れていないことがわからない場合。ありがとう :)


編集: 私はこのように作成しますbackgroundQueue

dispatch_queue_t backgroundQueue;

そしてinit

backgroundQueue = dispatch_queue_create("uni.que.identifier.bgqueue", NULL);

そしてそれを解放deallocします:

dispatch_release(backgroundQueue);
4

1 に答える 1