W mojej aplikacji mam kontroler UITableViewController.Załaduj ponownie dane UITableView w tle
Jego tableView jest podzielony na 3 sekcje.
Pobieram dane do każdej z tych sekcji z mojego serwera. Aby to zrobić, mam 3 funkcje (na przykład f1 f2 i f3). Każdy aktualizuje odpowiednią NSArray, używaną jako źródło danych dla mojej tabeli.
Teraz chcę przeładować dane za pomocą tych funkcji i odświeżyć mój tableView po wykonaniu tych 3 funkcji, ale bez przeszkadzania użytkownikowi.
Nie jestem używany z asynchronicznym żądaniem, blokami, wątkami itp. ... i szukam wskazówek.
Faktycznie, tutaj jest to, co robię:
-(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
}
Ale tutaj, mój tableView jest "zamrożony", dopóki nie jest odświeżany.
Nie obchodzi mnie kolejność wykonywania f1 f2 i f3, ale muszę poczekać, aż te 3 funkcje zostaną wykonane przed odświeżeniem mojej tableView.
Dzięki za pomoc.
EDIT
Dzięki za wszystkie odpowiedzi.
Oto roztwór roboczy:
Jak MRO suggets, usunąłem kolejkę wysyłać z viewDidLoad i zastąpić w reloadDatas:
dispatch_queue_t concurrentQueue = dispatch_get_main_queue();
z
dispatch_queue_t mainThreadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
I wreszcie, Odświeżam mój stół w głównym wątku
dispatch_async(dispatch_get_main_queue(), ^{ [myDisplayedTable reloadData]; });
Y czy utworzyłeś współbieżne miejsce? – abhi1992