0

さまざまなxmlファイルをダウンロードしてWebサイトから解析するプロセスを作成しようとしています。現時点では、...を使用してすべての作業を行うことができます。

dispatch_async(dispatch_get_current_queue(),^ { [self updatePersons]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updatePlaces]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updatePositions]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updateContacts]; });

を使用しているため、これによりメインスレッドがロックされますdispatch_get_current_queue。以下の方法を試した場合のように、これらを互いに中断せずに実行するにはどうすればよいですか。

dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePersons]; });

私が使用しているコードの完全版は以下のとおりですが、ログ出力によると、それらは同時に実行されます(すべてを正しく理解していれば、これは目的です)。ただし、それらのコードが実際に終了することはありません...ログ出力ですべてが解析されているかどうかがわかりません。メイン画面はフリーズしたままです。ログには、表示するはずのログの一部しか表示されません...他のプロセスのNSLogメッセージによって中断されているようです。

dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePersons]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePlaces]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePositions]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updateContacts]; });

dispatch_async(dispatch_get_global_queue(-2,0),^ { 

            dispatch_async(dispatch_get_main_queue(),^  {[self setBottomBarToUpdated]; });
 });

下部のバーのラベルで実行中に進行状況についてユーザーを更新しながら、アプリが上記の各機能を介して情報を取得する方法を作成しようとしています。4つの関数のそれぞれで以下のコードを使用することで、テキストの更新が正常に機能しているようです...

dispatch_async(dispatch_get_main_queue(),^ {
         [self setBottomBarToUpdating:@"Updating Places..."];
});

誰かがキューを使用する適切な方法について助けを提供して、私のアプリがロックされないようにすることができれば、私はそれを大いに感謝します。ありがとう!

4

2 に答える 2

3

独自のプライベート同時ディスパッチキューを作成する場合は、「バリアブロック」を使用できます。このブロックは、以前に送信された他のすべてのブロックが終了したときにのみ実行されます。

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

// These blocks are executed concurrently:
dispatch_async(queue, ^ { [self updatePersons]; });
dispatch_async(queue, ^ { [self updatePlaces]; });
// ...

dispatch_barrier_async(queue, ^ {
    // This will be executed when all previous blocks are finished.
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdated];
    });
});
于 2012-08-14T14:30:14.307 に答える
0

それらを順番に実行し、進行に合わせて UI を更新するようにしたいようです。その場合は、シリアル キューを使用できます。

dispatch_queue_t serialQueue = dispatch_queue_create("com.company.MyQueue", NULL);

dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Persons..."];
    }
    [self updatePersons]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Places..."];
    }
    [self updatePlaces]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Positions..."];
    }
    [self updatePositions]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Contacts..."];
    }
    [self updateContacts]; 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Finished updating"];
    }
});

dispatch_release(serialQueue);
于 2012-08-15T04:44:00.650 に答える