2016-02-19 65 views
0

我使用NSURLSession使多个异步请求到我的服务器与下面的代码:设置的NSMutableDictionary多个键/值对NSURLSession repsonse块

[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    ... 
    [self.dict setObject:some_obj forKey:some_key]; 

}] resume]; 

内响应块我设置的键/值配对可变字典。

我的问题是: 由于请求是异步的,理论上我的程序是否会尝试同时为字典设置键/值对?如果这是可能的,会发生什么?

  1. 该应用程序崩溃了吗?
  2. 未定义某些键/值对吗?
  3. 或者它会工作,因为一个键/值设置将等待另一个完成?

如果3.不是这样,我能做些什么使3)工作?

回答

0

NSMutableDictionary没有记录为线程安全的,所以它几乎肯定不是。

然而,Apple docs on NSURLSession说:

完成处理负载请求完成时调用。该处理程序在委托队列上执行。

你(可以)通过在会话创建委托队列,文档说:

调度委托调用和完成处理的操作队列。队列不必是串行队列。如果为零,会话将创建一个串行操作队列以执行所有委托方法调用和完成处理程序调用。

因此,只要设置密钥,如果你没有显式创建与并行队列的会话,你应该没问题。如果你这样做了,那么你需要同步访问。最简单的方法是@synchronized块:

@synchronized (self.dict) { 
    self.dict[key] = value; 
} 

取决于何时何地,你正在阅读的价值,您可能需要反正同步块。

+0

感谢您的回答。我在我的类的接口中声明了一个(nonatomic,assign)int计数器属性。在完成处理程序块中,我使用self.counter--减少计数器属性。我是否也需要'@synchronized {self.counter - }'int计数器属性? – user2415476