我必须打电话给我的API以更新几个项目.所以我异步调用每个项目的API.每个API调用在完成后执行回调函数.这些回调减少了一个计数器,所以当计数器达到0时,我知道所有的API调用都已完成.当计数器达到0时,我想调用最终回调函数(一次,当所有调用完成时),以便更新我的UI等等.最后的回调是在开始时传递给我的服务并存储在类属性中以便以后执行.
可执行游乐场来源:
// Playground - noun: a place where people can playclass MyService{ let API = MyAPI() var storedFinalCallback: () -> VoID = { arg in } var queue: Int = 0 func update(items: [String],finalCallback: () -> VoID ) { // Count the necessary API calls queue = items.count // Store callback for later execution storedFinalCallback = finalCallback for item in items { // Call API per item and pass queueCounter as async callback API.updateCall(item,callback: self.callback()) } } func callback() { queue-- // Execute final callback when queue is empty if queue == 0 { println("Executing final callback") storedFinalCallback() } }}class MyAPI{ func updateCall(item: String,callback: ()) { println("Updating \(item)") }}let myItems: [String] = ["Item1","Item2","Item3"]let myInstance: MyService = MyService()myInstance.update(myItems,finalCallback: {() -> VoID in println("Done")})
问题是,使用此代码,最终的回调将以错误的顺序调用.
显然回调函数已经执行但没有正确传递.但是,这是我能够做到的唯一方法,没有编译器错误.
任何帮助都会非常感激 – 我已经坚持了两天了.
解决方法 我终于找到了工作代码:// Playground - noun: a place where people can playclass MyService{ let API = MyAPI() var storedFinalCallback: () -> VoID = { arg in } var queue: Int = 0 func update(items: [String],callback: self.callback) } } func callback() { queue-- // Execute final callback when queue is empty if queue == 0 { println("Executing final callback") storedFinalCallback() } }}class MyAPI{ func updateCall(item: String,callback: () -> VoID) { println("Updating \(item)") callback() }}let myItems: [String] = ["Item1",finalCallback: {() -> VoID in println("Done")})总结
以上是内存溢出为你收集整理的在Swift中传递和存储闭包/回调全部内容,希望文章能够帮你解决在Swift中传递和存储闭包/回调所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)