什么是复杂的多线程应用程序的最佳网络解决方案?

时间:2013-05-24 15:38:05

标签: ios multithreading cocoa-touch delegates nsurlconnection

我有一个流媒体iOS应用程序,可以将视频捕获到Wowza服务器。 这是一只野兽,它真的很挑剔。

我正在从一个射出JSON的php脚本中获取配置设置。 现在我已经实现了这个,我遇到了一些奇怪的线程问题。我的应用程序连接到主机,说它的流,但从来没有实际发送数据包。

摆脱远程配置NSURLConnection(我已经确定格式正确)委托修复了问题。所以我认为一些数据在线程之间被误解或类似。

有什么可以帮助我知道:

  • 是否在主线程上调用了NSURLConnection委托方法?
  • 非委托数据在委托方法中是否容易受到攻击?
  • 在处理复杂的线程应用时,从网络抓取数据的最佳做法是什么?

4 个答案:

答案 0 :(得分:3)

你看过AFNetworking吗?

http://www.raywenderlich.com/30445/afnetworking-crash-course

https://github.com/AFNetworking/AFNetworking

它非常强大,并且非常适合线程化,并且有几个很好的教程。

答案 1 :(得分:2)

  

在主线程上调用NSURLConnection委托方法吗?

是的,在请求完成时,如果你在主线程上启动它,它会在主线程上给出一个回调。

  

非委托数据在委托方法中是否容易受到攻击?

通常,集合值(如数组)容易受到多个线程的攻击;其余的不应该创造除种族问题以外的任何东西。

  

在处理复杂的线程应用时,从网络抓取数据的最佳做法是什么?

我认为使用GCD处理线程更好,使用NSURLConnection进行异步检索应该会有所帮助。很少有网络库可以为您做样板代码,例如AFNetworking和ASIHTTPRequest(虽然这有点旧)。

答案 2 :(得分:1)

  

在主线程上调用NSURLConnection委托方法吗?

委托方法可以在NSOperationQueue或线程上执行。如果您未明确计划连接,它将使用收到start消息的线程。这个可以是主线程,但它也可以是任何其他辅助线程,它也应该有一个运行循环。

您可以使用方法

设置线程(间接)

- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode

设置从当前线程中检索的运行循环。运行循环与1:1关系的线程相关联。也就是说,为了设置一个执行委托方法的某个线程,你需要在这个线程上执行,从当前线程中检索Run Loop并将scheduleInRunLoop:forMode:发送到连接。

设置专用辅助线程要求该线程具有运行循环。确保这并不总是直截了当,需要“黑客”。

或者,您可以使用方法

- (void)setDelegateQueue:(NSOperationQueue *)queue

为了设置将执行委托方法的队列。然后确定哪个线程实际用于执行代理。

一定不能使用这两种方法 - 所以要在一个线程上安排 OR 一个队列。有关更多信息,请参阅文档。

  

非委托数据在委托方法中是否容易受到攻击?

您应始终同步对共享资源的访问 - 即使对于整数也是如此。在某些多处理器系统上,甚至不能保证对共享整数的访问是安全的。您必须在两个线程上使用内存屏障才能保证。

您可以使用串行队列(NSOperationQueue或调度队列)来保证对共享资源的安全访问。

  

在处理复杂的线程应用时,从网络抓取数据的最佳做法是什么?

如前所述,利用队列,然后您不必处理线程。 “抓取数据”不仅是一个线程问题;)

如果您更喜欢更具体的答案,则需要更详细地描述您的问题。

答案 3 :(得分:0)

回答第一个问题:在启动相关NSURLConnection对象的异步加载操作的线程上调用委托方法。