У меня проблема при обновлении данных в моем UITableview. В настоящее время есть UIRfreshControl, который при срабатывании (путем вытягивания вниз) выполняет следующее:
- (void)refreshByScrolling:(UIRefreshControl *)refreshControl {
[self refreshPriceInformation];
[refreshControl endRefreshing];
}
В этот момент пользовательский интерфейс зависает (за исключением вращающегося элемента refreshControl, пока метод [self refreshPriceInformation] не будет завершен.
Есть ли способ сделать так, чтобы пользовательский интерфейс не зависал при обновлении данных? Например, в приложениях Twitter и Instagram вы можете потянуть вниз, чтобы обновить и сразу после этого начать прокручивать таблицу вниз.
Код для [self refreshPriceInformation] приведен ниже.
-(void)refreshPriceInformation
{
isRefreshing = true;
//Creating Queues for Concurrent refreshes
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_apply([watchedSkinList count], queue, ^(size_t i) {
SkinToWatch *watchedSkin =[watchedSkinList objectAtIndex:i];
[watchedSkin refreshPriceInformation];
});
dispatch_async(queue, ^{
NSLog(@"Saving Data to Phone");
// resaving data to phone
NSData *newdata = [NSKeyedArchiver archivedDataWithRootObject:watchedSkinList];
[[NSUserDefaults standardUserDefaults] setObject:newdata forKey:@"watchSkinsArray"];
[[NSUserDefaults standardUserDefaults]synchronize ];
isRefreshing = false;
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
//Updating Refresh Label
[self updateDateAndSaveDurning:false];
});
}
Спасибо!
РЕДАКТИРОВАТЬ ***** Как заявил HackerInHeels ниже, обертывание dispatch_apply с DISPATCH_QUEUE_PRIORITY_BACKGROUND предотвратило зависание пользовательского интерфейса!
Дополнительные вопросы: 1) как убедиться, что этот блок кода выполняется последним?
dispatch_async(queue, ^{
NSLog(@"Saving Data to Phone");
//rest of code...
});
Перед внедрением решения это был последний блок, который нужно было выполнить. После решения это уже не так. Я ставлю в него еще одну очередь? Сделать синхронизацию, а не aysnc?
Спасибо еще раз!