ios – 在后台重新加载UITableView的数据

前端之家收集整理的这篇文章主要介绍了ios – 在后台重新加载UITableView的数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我有一个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之前完成这三个函数.

谢谢你的帮助.

编辑

谢谢你的所有答案.

这是工作解决方案:

作为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]; });

解决方法

所以你的“后台线程”实际上是你的主线程.您必须使用dispatch_get_global_queue并指定实际获得不同线程的优先级.此外,viewDidLoad中的dispatch async是无用的,因为在主线程中调用所有视图控制器生命周期方法.我建议你在f1,f2和f3方法中做如下的事情:

首先启动异步URL请求,然后在完成块中更新arrayX并重新加载tableview的特定部分.这样,所有三个请求都可以同时发生,并且表只是在每个请求完成时更新必要的数据.或者,如果您只想重新加载一次,只需用后台线程替换concurrentQueue变量,然后在主线程上执行[tableView reloadData].

猜你在找的iOS相关文章