2016-07-26 34 views
0

我对iOS目标C中的多线程有疑问。我从来没有在线程上工作过。 在我的应用程序中,我有几个任务只需要在后台运行,用户界面不会被冻结。 以下是代码片段,iOS目标中的多线程C

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
      [self someFunctionCallinWebservice]; 
      dispatch_async(dispatch_get_main_queue(), ^(void){ 
       //UI Updates 
      }); 
     }); 

在上面的代码,功能:someFunctionCallinWebservice呼吁里面我是用AFNetworking库web服务。在web服务,如果它是成功的,那么我在本地保存数据。我打电话的成功块的功能,以节省从服务器发送类似下面的数据,

[manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject){ 
[self functionToSaveData:someArray]; 
} 

这里someFunctionCallinWebservice在后台运行,但在前台[self functionToSaveData:someArray]运行。我是否应该在后台线程中使用这个functionToSaveData?

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

请帮助...

+0

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

回答

2

是,U可以调用背景线程functionToSaveData功能它不会产生任何问题,但如果u想要做的任何UI更新(如: - >重装的tableView,显示或隐藏一些意见),那时你必须在主线程上做,否则它不会对你的UI产生任何影响。

dispatch_async(dispatch_get_main_queue()) { 
     //Do any UI updates here  
     } 
1

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

对于您似乎正在执行的操作(从互联网获取数据)的类型,我建议您使用iOS异步API,例如URLSession,这样可以免去您自己对多线程进行任何操作的需要。

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