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中的多线程的主要内容,如果未能解决你的问题,请参考以下文章

python的多线程编程

C中的多线程与多处理

C/C++ 中的多线程状态机实现

尝试使用一些代码来利用 C 中的多线程

C ++中的多线程文件散列[关闭]

详解python中的多线程