AFNetworking中的url_session_manager_create_task_safely

对于url_session_manager_create_task_safely这个有什么用?其实这个是被当做是一个在ios8以下,NSURLSessionDataTask出现的一个Bug。问题产生的原因就是当队列是并发的,这是当两个任务同时在不同的线程上创建任务的时候taskIdentifier可能是一样的。

这样在AFNetworking中会产生的问题,在2014年的时候被人提出,

AFNetworking中的url_session_manager_create_task_safely

大致的意思其实就是当我们同时创建两个任务,返回了重复的taskIdentifier,这样的话第一个被创建的completionHandler就会被清空,被第二个任务的completionHandler给替换,如果第一个数据是早于第二个数据返回的,那么第一个数据返回之后就会去调用第二个任务的completionHandler。

AFNetworking中的url_session_manager_create_task_safely

对于这个Bug其实上面也是有所描述在一个网站上http://openradar.appspot.com/radar?id=5871104061079552有描述,具体如下,正好说明了这个问题

AFNetworking中的url_session_manager_create_task_safely

所以我们可以看到在AFN中有这样的代码,其实就是在判断是不是ios8平台以下,如果是的话,就加一个串行队列解决问题

AFNetworking中的url_session_manager_create_task_safely

关于这一点,在讨论区里面也有人说在ios8的时候被修复,而且这里必须要做判断是不是ios8以下,在之前的一个版本里面是没有判断的

AFNetworking中的url_session_manager_create_task_safely

判断之后的版本如下所示

AFNetworking中的url_session_manager_create_task_safely