何时在NSURLSessionTask上设置.Completed状态,它如何依赖/影响同一任务的completionHandler?
有没有办法确保.Completed状态只在completionHandler执行完毕后才设置?
题
关于这里的另一个问题…… Chaining multiple async functions in Swift
我指出了高级NSOperations WWDC Talk和Sample Code的方向.
在将部分代码复制到我自己的项目中之后,我发现我似乎遇到了竞争条件,有时会有效,有时会失败,具体取决于竞争条件的发挥方式.
我创建的 *** 作几乎是示例代码中DownloadEarthquakesOperation的副本.
它是GroupOperation的子类,包含URLSessionTaskOperation. NSURLSessionTask是使用completionHandler创建的,它处理下载的数据.
类URLSessionTaskOperation通过观察其任务的状态属性,然后在更改为.Completed时完成 *** 作来工作.
我遇到的问题是,在completionHandler完成处理之前,任务的状态似乎已更改为.Completed.
我有的完成处理程序是这样的……
// this is a direct copy of the sample code just using data tasklet task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data,response,error in self.downloadFinished(data,response: response as? NShttpURLResponse,error: error)}
它调用的函数(伪代码)是这样的……(我目前无法访问确切的代码).
func downloadFinished(data: NSData?,response: NShttpURLResponse?,error,NSError?) { // if the error is not nil then finish operation with error // if the response status code is not correct then finish with error // try to convert the data to a JsON object using NSJsONSerialization // finish with error if conversion Failed // get a single Int value out of the JsON object // store the single Int value in an instance variable}
这里没有异步代码.
完成此 *** 作之后(相当于示例代码中的GetEarthquakesOperation)从实例变量中获取值并将其传递给下一个 *** 作.
问题是,有时这个值存在,有时它是零.
通过注销不同类中的各行,我可以看到网络 *** 作在执行完成处理程序的某个时刻被设置为已完成.有时在设定值之前,有时在之后.
令人困惑的是,我试图在示例应用程序中强制执行此 *** 作,但我无法做到.我试过睡觉完成处理程序,我已经尝试了一个很长的执行时间循环,但它们似乎都没有工作.
任何人都可以帮我解决这个竞争条件.
解决方法 好的,这很奇怪.http://www.oliverfoggin.com/advanced-nsoperations-nsurlsessiondatatask-vs-nsurlsessiondownloadtask/
NSURLSessionDataTask和NSURLSessionDownloadTask都运行完成处理程序并以不同方式设置其完成状态.
下载任务仅在完成处理程序执行完毕后将自身设置为已完成.
完成处理程序开始执行后,数据任务将自身设置为已完成.
这导致了我自己的项目中的竞争条件.我想我现在就转而使用下载任务了.
我也将提交雷达.
总结以上是内存溢出为你收集整理的ios – Apple的Advanced NSOperations示例代码中的竞争条件全部内容,希望文章能够帮你解决ios – Apple的Advanced NSOperations示例代码中的竞争条件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)