2016-12-15 142 views
0

我想我了解了以下工作但希望确认。IOS/Objective-C的:返回到主线程

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. 
} 

我的问题是,我可以想当然的主线程上的显示将不会发生,直到在后台发生的一切结束后 - 无论多久?

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

+0

这是正确的。但你是什么意思与“显示器是不是......“?如何才能‘显示’做任何事情。 –

+0

的调用'[NSData的dataWithContentsOfURL]'可能会做从网络的网络请求,具体情况取决于。URL指向如果它是一个文件URL指向本地文件系统上的文件,它会简单地从本地文件读取数据。如果它像'HTTP远程URL://富/ bar.jpg'那么它将同步地从远程服务器获取数据 –

回答

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:是不是异步的,意味着它不会返回,直到数据已被提取和更新。

+0

因此,如果提供的是dispatch_asynch中的主队列,它将等待读取数据完成? – Arjun

+0

是的,它与其他方法调用没有区别但正如我所说的,这只有在fetchData:'的实现没有返回,直到数据被提取并存储在核心数据中时才会起作用,如果它的实现是异步的,那么'fetchData:'将返回太快,解决方案将会添加一个完成处理程序到'fetchData'。 – rmaddy

+0

我感觉你不明白异步函数调用是如何工作的。异步函数在任务完成之前立即返回。 –