1

我试图在一个视图控制器中有几个不同的 uitableviews。在此处的答案之一的帮助下,我能够做到这一点并将每个 tableviewcontroller 设置在单独的文件中。现在的问题是数据是从核心数据加载的,并且加载速度不够快,无法让主 tableview 显示它。我必须在数据加载后重新加载。问题是我正在尝试自动执行此操作。我设置了一个线程,当发布被调用时,应用程序在 uidocument 打开操作中崩溃。我不确定如何在数据加载完成之前让线程不被释放。这是一些代码。

[self.pplTableView setDelegate:self.peopleListController]; //pplTableView is the tableview in the mainviewcontroller that shows on the screen
[self.pplTableView setDataSource:self.peopleListController];
dispatch_queue_t fetchPpl = dispatch_queue_create("pplFetch", NULL);
dispatch_async(fetchPpl, ^{
        self.peopleListController.view = self.peopleListController.tableView;
    dispatch_async(dispatch_get_main_queue(),
                   ^{
                       [self.pplTableView reloadData];
                       NSLog(@"rows %@",[self.pplTableView numberOfSections]); 

                   });
});

dispatch_release(fetchPpl);

这是来自委托数据的 tableviewcontroller

- (void)viewDidLoad
{
    [super viewDidLoad];
    if(!self.peopleDatabase){

        NSURL *url = [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject];

        url = [url URLByAppendingPathComponent:@"Database"];
        //NSLog(@"URL ->  %@",url);
        self.peopleDatabase = [[UIManagedDocument alloc]initWithFileURL:url];
    }else {
        [self useDocument];
    }

}


-(void)useDocument{

if (self.peopleDatabase.documentState == UIDocumentStateClosed){
    [self.peopleDatabase openWithCompletionHandler:^(BOOL success){
        [self setupFetchResultsController];

    }];

} else if (self.peopleDatabase.documentState == UIDocumentStateNormal){
    [self setupFetchResultsController];
}  

}

self.peopleListController.view = self.peopleListController.tableView;

当此行被调用时,控制器被加载并调用 useDocument。它不会等待 useDocument 完成继续。我怎么能让这个等待。

谢谢你!

4

0 回答 0