私のアプリには、UITableViewController があります。
その tableView は 3 つのセクションに分かれています。
これらの各セクションのデータをサーバーからダウンロードします。これを行うには、3 つの関数 (たとえば、f1 f2 と f3) があります。それぞれが、テーブルのデータ ソースとして使用される対応する NSArray を更新します。
今私が望むのは、この関数を使用してデータをリロードし、この 3 つの関数が完了したら tableView を更新することですが、ユーザーを邪魔することはありません。
私は非同期リクエスト、ブロック、スレッドなどに慣れていないので、ヒントを探しています。
実際、ここに私がしていることがあります:
-(void)viewDidLoad
{
//some settings
[NSTimer scheduledTimerWithTimeInterval:15.0 target:self selector:@selector(reloadDatas) userInfo:nil repeats:YES];
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
[self reloadDatas];
});
}
-(void)reloadDatas
{
dispatch_queue_t concurrentQueue = dispatch_get_main_queue();
dispatch_async(concurrentQueue, ^{
[self f1];
[self f2];
[self f3];
[myDisplayedTable reloadData];
});
}
-(void)f1
{
//load datas with a url request and update array1
}
-(void)f2
{
//load datas with a url request and update array2
}
-(void)f3
{
//load datas with a url request and update array3
}
しかし、ここでは、私の tableView は更新されるまで「凍結」されています。
f1 f2 と f3 の実行順序は気にしませんが、tableView を更新する前に、この 3 つの関数が完了するまで待つ必要があります。
ご協力いただきありがとうございます。
編集
ご回答ありがとうございます。
実用的なソリューションは次のとおりです。
mros が提案するように、viewDidLoad からディスパッチ キューを削除し、reloadDatas に置き換えます。
dispatch_queue_t concurrentQueue = dispatch_get_main_queue();
と
dispatch_queue_t mainThreadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
最後に、メインスレッドでテーブルをリロードします
dispatch_async(dispatch_get_main_queue(), ^{ [myDisplayedTable reloadData]; });