2

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

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

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

对我有帮助的是知道:

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

4 回答 4

3

你看过 AFNetworking 吗?

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

https://github.com/AFNetworking/AFNetworking

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

于 2013-05-24T15:45:48.467 回答
2

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

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

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

通常集合值(如数组)容易受到多线程的影响;其余的不应该造成任何比种族问题。

在处理复杂的线程应用程序时,从 Web 获取数据的最佳实践是什么?

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

于 2013-05-24T15:52:31.630 回答
1

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

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

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

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

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

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

或者,您可以使用方法

- (void)setDelegateQueue:(NSOperationQueue *)queue

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

不能同时使用这两种方法——所以安排在一个线程一个队列上。请查阅文档以获取更多信息。

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

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

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

在处理复杂的线程应用程序时,从 Web 获取数据的最佳实践是什么?

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

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

于 2013-05-24T16:37:11.880 回答
0

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

于 2013-05-24T15:45:49.160 回答