将新项目上传到表格视图

时间:2016-07-08 09:52:21

标签: ios objective-c uitableview

我有从SQL数据库加载新数据(取决于页面)的表视图。问题是,当我在主线程中加载它时,它会阻止UI一段时间。当我尝试在后台执行“艰苦工作”,并在主线程中重新加载数据时,奇怪的事情开始发生,例如,表视图部分标题移动到错误的位置,并且我加载了大量数据。

第一种情况,所有工作但阻止用户界面:

   [self.tableView addInfiniteScrollingWithActionHandler:^{
        @strongify(self)

        if (!self.viewModel.isUpdating){

            self.viewModel.isUpdating = YES;
            [self.tableView.infiniteScrollingView startAnimating];
            [self.viewModel nextPage];
            [self.tableView reloadData];
            self.viewModel.isUpdating = NO;   
        }

    }];

在第二种情况下,我试图做后台工作,因为没有按预期工作:

if (!self.viewModel.isUpdating){


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //Add some method process in global queue - normal for data processing

     self.viewModel.isUpdating = YES;
     [self.tableView.infiniteScrollingView startAnimating];
        [self.viewModel nextPage];


       dispatch_async(dispatch_get_main_queue(), ^(){
            //Add method, task you want perform on mainQueue
            //Control UIView, IBOutlet all here
            [self.tableView reloadData];
            self.viewModel.isUpdating = NO;

        });

        //Add some method process in global queue - normal for data processing

    });




}

}];

如何修改我的代码以不加载主线程,并且没有“怪异”的东西?

1 个答案:

答案 0 :(得分:0)

你试过这样的事吗。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
.....
 dispatch_async(dispatch_get_main_queue(), ^{
                [self performSelectorOnMainThread:@selector(updateView) withObject:nil waitUntilDone:YES];
            });
        });
......
-(void)updateView{
[self.tableView reloadData];
self.viewModel.isUpdating = NO;
}

用户PerformSelectorOnMainThread它可以帮助你。