IOS / Objective-C:返回主线程

时间:2016-12-15 18:40:48

标签: ios dispatch-async

我想我理解以下内容如何有效但希望得到确认。

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: dataUrl];
    [self fetchData:data];//go to web, get data and store in core data
}
dispatch_async(dispatch_get_main_queue(), ^{
    //display new data on main thread.
}

我的问题是,我是否可以理所当然地认为主线程上的显示只有在后台发生的所有事情结束后才会发生 - 无论多长时间?

我希望得到确认的原因是偶尔我会观察显示器的一些问题。当后台线程尚未完成保存时,想要确保显示器没有尝试访问核心数据。

1 个答案:

答案 0 :(得分:2)

您的代码不正确。您正在尝试在从URL检索数据之前更新UI。

你需要:

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: dataUrl];
    [self fetchData:data];//go to web, get data and store in core data
    dispatch_async(dispatch_get_main_queue(), ^{
        //display new data on main thread.
    }
}

此代码还假定fetchData:不是异步的,这意味着它在获取和更新数据之前不会返回。