ios – Apple的Advanced NSOperations示例代码中的竞争条件

ios – Apple的Advanced NSOperations示例代码中的竞争条件,第1张

概述TL:DR 何时在NSURLSessionTask上设置.Completed状态,它如何依赖/影响同一任务的completionHandler? 有没有办法确保.Completed状态只在completionHandler执行完毕后才设置? 题 关于这里的另一个问题…… Chaining multiple async functions in Swift 我指出了高级NSOperations WW TL:DR

何时在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示例代码中的竞争条件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1049780.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存