【问题标题】:What is the best networking solution for a complex multithreaded app?对于复杂的多线程应用程序,最好的网络解决方案是什么?
【发布时间】:2013-05-24 15:38:05
【问题描述】:

我有一个流式 iOS 应用程序,可以将视频捕获到 Wowza 服务器。 它是一头野兽,而且非常挑剔。

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

摆脱远程配置NSURLConnection(我已确保其格式正确)委托解决了该问题。所以我认为要么某些数据在线程中被误解,要么类似的东西。

知道对我有什么帮助:

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

【问题讨论】:

    标签: ios multithreading cocoa-touch delegates nsurlconnection


    【解决方案1】:

    您看过 AFNetworking 吗?

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

    https://github.com/AFNetworking/AFNetworking

    它非常健壮,对线程有很大帮​​助,并且有几个很好的教程。

    【讨论】:

      【解决方案2】:

      是否在主线程上调用了 NSURLConnection 委托方法?

      是的,在请求完成时,如果您在主线程上启动它,它会在主线程上进行回调。

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

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

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

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

      【讨论】:

        【解决方案3】:

        是否在主线程上调用了 NSURLConnection 委托方法?

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

        您可以使用方法(间接)设置线程

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

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

        设置一个专用的辅助线程需要这个线程有一个运行循环。确保这并不总是直截了当,需要“破解”。

        或者,你可以使用方法

        - (void)setDelegateQueue:(NSOperationQueue *)queue

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

        不得同时使用这两种方法 - 所以安排在一个线程上一个队列。有关详细信息,请参阅文档。

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

        您应该始终同步对共享资源的访问——即使是整数。在某些多处理器系统上,甚至不能保证访问共享整数是安全的。为了保证这一点,您必须在两个线程上都使用内存屏障。

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

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

        如前所述,使用队列,那么您就不必处理线程了。 “抓取数据”不仅是线程问题;)

        如果您希望得到更具体的答案,则需要更详细地描述您的问题。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-29
            • 1970-01-01
            • 2015-01-30
            • 2010-12-12
            • 2010-09-14
            • 1970-01-01
            • 2020-08-25
            • 1970-01-01
            相关资源
            最近更新 更多