Nella mia app, ho un UITableViewController.Ricarica dati di UITableView sullo sfondo
Il suo TableView è diviso in 3 sezioni.
I dati di download per ciascuna di queste sezioni dal mio server. Per fare ciò, ho 3 funzioni (ad esempio f1 f2 e f3). Ogni aggiornamento di un NSArray corrispondente, utilizzato come origine dati per la mia tabella.
Ora quello che voglio è ricaricare i dati utilizzando queste funzioni e aggiornare il mio tableView una volta che queste 3 funzioni sono state fatte, ma senza disturbare l'utente.
Non sono utilizzato con richiesta asincrona, blocchi, thread ecc ... e sto cercando suggerimenti.
In realtà, qui è quello che faccio:
-(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
}
Ma qui, il mio tableView è "congelato" fino a quando non viene aggiornata.
Non mi interessa l'ordine di esecuzione di f1 f2 e f3, ma devo aspettare che queste 3 funzioni vengano eseguite prima di aggiornare il mio TableView.
Grazie per il vostro aiuto.
EDIT
Grazie per tutte le vostre risposte.
Ecco la soluzione di lavoro:
Come MROS suggets, ho rimosso la coda dispaccio dal viewDidLoad, e sostituire in reloadDatas:
dispatch_queue_t concurrentQueue = dispatch_get_main_queue();
con
dispatch_queue_t mainThreadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
E, infine, Ricarico il mio tavolo in un thread principale
dispatch_async(dispatch_get_main_queue(), ^{ [myDisplayedTable reloadData]; });
Y hai creato ConcurrentQueue? – abhi1992