我在 UITableview 中刷新数据时遇到问题。目前有一个 UIRefreshControl,当触发(通过下拉)时,执行以下操作:
- (void)refreshByScrollingUIRefreshControl *)refreshControl {
[self refreshPriceInformation];
[refreshControl endRefreshing];
}
此时 UI 卡住(期待旋转的 refreshControl,直到 [self refreshPriceInformation] 方法完成。
有没有办法让它在我刷新数据时 UI 不会卡住?例如,在 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 performSelectorOnMainThreadselector(reloadData) withObject:nil waitUntilDone:YES];
//Updating Refresh Label
[self updateDateAndSaveDurning:false];
});
}
谢谢!
编辑****** 正如 HackerInHeels 下面所说,用 DISPATCH_QUEUE_PRIORITY_BACKGROUND 包装 dispatch_apply 已经阻止了 UI 卡住!
跟进问题: 1)如何确保这是最后执行的代码块?
dispatch_async(queue, ^{
NSLog(@"Saving Data to Phone");
//rest of code...
});
在实现解决方案之前,它是执行的最后一个 block 。解决之后,就不是这样了。我是否将其放入另一个队列?让它同步而不是aysnc?
再次感谢!
你能帮我试试这个吗..
在 dispatch_async 中包装 SkinToWatch 代码
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
dispatch_apply([watchedSkinList count], queue, ^(size_t i) {
SkinToWatch *watchedSkin =[watchedSkinList objectAtIndex:i];
[watchedSkin refreshPriceInformation];
});
});
关于ios - 刷新 UITableView 的内容会卡住应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24814700/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |