iOS目标C中的多线程
Posted
技术标签:
【中文标题】iOS目标C中的多线程【英文标题】:Multi threading in iOS objective C 【发布时间】:2016-07-26 10:10:20 【问题描述】:我对 ios 目标 C 中的多线程有疑问。我从未处理过线程.. 在我的应用程序中,我有几个任务只需要在后台运行,这样 UI 就不会被冻结。 以下是代码sn -p,
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
[self someFunctionCallinWebservice];
dispatch_async(dispatch_get_main_queue(), ^(void)
//UI Updates
);
);
在上面的代码中, function : someFunctionCallinWebservice 调用我正在使用 AFNetworking 库的 web 服务。在网络服务中,如果成功,那么我将在本地保存数据。我正在成功块中调用一个函数来保存从服务器发送的数据,如下所示,
[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject)
[self functionToSaveData:someArray];
这里 someFunctionCallinWebservice 在后台运行,但[self functionToSaveData:someArray]
在前台运行。我应该在后台线程中也有这个functionToSaveData吗?
我的意思是,如果我在后台调用一个函数,那么该函数的所有相关功能,例如调用服务器、获取数据并保存它也必须属于后台线程,对吗?为什么要重新创建一个线程?
请帮忙...
【问题讨论】:
它都可以在后台运行直到您需要以任何方式与 UI 类进行交互。因此,在后台获取并保存,然后在完成时轻推 UI 以更新。 【参考方案1】:是的,你可以在 background 线程中调用 functionToSaveData 函数,它不会产生任何问题,但如果你想在那个时候你必须在主线程上做,否则它不会对你的 UI 产生任何影响。
dispatch_async(dispatch_get_main_queue(),^
//Do any UI updates here
);
编辑: Swift 4
DispatchQueue.main.async
//Do any UI updates here
【讨论】:
【参考方案2】:多线程是一个大而难的课题,iOS 有不同类型的支持。我建议您先阅读 Apple 的 Threading Programming Guide。
对于您似乎正在执行的操作类型(从 Internet 获取数据),我建议您使用 iOS 异步 API,例如 URLSession,这样就无需自己执行任何多线程操作。
具体问题的答案取决于您的 POST:parameters:success:
操作是同步操作还是异步操作,这取决于 functionToSaveData:
实际执行的操作。
假设functionToSaveData:
旨在与应用程序的其余部分共享数据,最好在主线程上进行,以避免同步问题。
【讨论】:
以上是关于iOS目标C中的多线程的主要内容,如果未能解决你的问题,请参考以下文章