gpt4 book ai didi

iphone - 循环中的 NSURLSession

转载 作者:可可西里 更新时间:2023-11-01 02:23:49 24 4
gpt4 key购买 nike

我希望运行此代码以从 URL 中获取多个图像,但尽管循环遍历了数组中的每个对象,但唯一保存的对象是最后一个。有更好的方法吗?

编辑: 似乎所有图像都是从不同的 URL 保存的,但它们都使用相同的文件名保存,循环中的最终文件名。这似乎是由 NSURLSession 和将图像写入文件发生时的延迟引起的,文件名已经设置为循环的最后一个。

for object in objectArray {

url = NSURL(string:object.urlToLoad)
imageFile = paths.stringByAppendingPathComponent("\(object.filename).png")

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
data.writeToFile(imageFile, atomically: true)
return
}

task.resume()
}

感谢您的帮助!

最佳答案

问题是它们都捕获/共享相同的 imageFile 变量,因为它是在 for 的范围之外声明的。因此,首先您要执行 n 次循环,在执行过程中用下一个文件名覆盖 imageFile 变量并触发异步下载。然后,稍后,当每个 n 闭包在下载完成时实际执行时,它们都引用相同的文件名,该文件名与数组中的最后一个值匹配。

尝试在它前面添加一个 let,从而在每次迭代中声明一个新的局部变量,每个闭包依次捕获该局部变量。您也应该对 url 执行相同的操作,即使它碰巧不是问题。

一般来说,这是另一个很好的例子,说明您应该如何在每个机会中使用 let 而不是 var,并避免在外部范围内重复使用变量的做法除非您特别想将数据传送到外部范围。

这里有一些独立的代码演示了这一点,没有 URL 下载方面,只有 5 个并行运行的 sleep 和打印:

import Dispatch
let q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

var shared: String = "shared=x"
for x: UInt32 in 1...5 {

shared = "shared=\(x)"
let unique = "unique=\(x)"
dispatch_async(q) {
sleep(x)
println("\(shared), \(unique)")
}

}

println("for loop completed, \(shared)")
dispatch_main()

关于iphone - 循环中的 NSURLSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com