iOS目标C中的多线程

iOS目标C中的多线程,ios,objective-c,multithreading,afnetworking,Ios,Objective C,Multithreading,Afnetworking,我对iOS objective C中的多线程有疑问。我从未在线程上工作过。。 在我的应用程序中,我有几个任务只需要在后台运行,这样UI就不会冻结。 下面是代码片段 dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ [self someFunctionCallinWebservice]; dispatch_async(disp

我对iOS objective C中的多线程有疑问。我从未在线程上工作过。。 在我的应用程序中,我有几个任务只需要在后台运行,这样UI就不会冻结。 下面是代码片段

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库的webservice。在webservice中,如果成功,那么我将在本地保存数据。我正在调用success块中的函数来保存从服务器发送的数据,如下所示

[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject){
[self functionToSaveData:someArray];
}
此处,someFunctionCallinWebservice在后台运行,但
[自功能存储数据:someArray]
在前台运行。我是否应该在后台线程中使用此函数来保存数据

我的意思是,如果我在后台调用一个函数,那么该函数的所有相关功能,如调用服务器、获取数据并保存数据,也必须在后台线程中,对吗?为什么我要再次创建另一个线程


请帮助…

是的,您可以在后台线程中调用functionToSaveData函数,这不会产生任何问题,但如果您想进行任何UI更新(例如:->重新加载tableView、显示或隐藏某些视图),那么您必须在主线程上进行此操作,否则不会对您的UI产生任何影响

dispatch_async(dispatch_get_main_queue(),^{
    //Do any UI updates here 
});
编辑:Swift 4

DispatchQueue.main.async {
         //Do any UI updates here   
        }

是的,您可以在后台线程中调用functionToSaveData函数,它不会产生任何问题,但如果您当时想进行任何UI更新(如:->重新加载tableView,显示或隐藏某些视图),您必须在主线程上执行此操作,否则不会对您的UI产生任何影响

dispatch_async(dispatch_get_main_queue(),^{
    //Do any UI updates here 
});
编辑:Swift 4

DispatchQueue.main.async {
         //Do any UI updates here   
        }

多线程是一个大而难的主题,iOS对它有不同类型的支持。我建议你先看看苹果的

对于您似乎正在执行的操作类型(从internet获取数据),我建议您使用iOS异步API,例如,这样就不需要自己执行任何多线程操作

具体问题的答案取决于您的
POST:parameters:success:
操作是同步操作还是异步操作,并且取决于
函数存储数据:
的实际功能。
假设
函数存储数据:
旨在与应用程序的其余部分共享数据,最好在主线程上执行,以避免出现同步问题。

多线程是一个大而难的主题,iOS有不同类型的支持。我建议你先看看苹果的

对于您似乎正在执行的操作类型(从internet获取数据),我建议您使用iOS异步API,例如,这样就不需要自己执行任何多线程操作

具体问题的答案取决于您的
POST:parameters:success:
操作是同步操作还是异步操作,并且取决于
函数存储数据:
的实际功能。
假设
函数存储数据:
旨在与应用程序的其余部分共享数据,最好在主线程上执行,以避免同步问题。

它可以在后台运行,直到您需要以任何方式与UI类交互。因此,在后台获取并保存,然后在完成时轻推UI进行更新。它可以在后台运行,直到您需要以任何方式与UI类交互为止。因此,在后台获取并保存,然后在完成时轻推UI以进行更新。