gpt4 book ai didi

ios - 网络 iOS : Background/MainThread?

转载 作者:行者123 更新时间:2023-11-29 02:46:08 25 4
gpt4 key购买 nike

我正在尝试将图像放入 cell.image 中。如果图像已经加载(因此,在缓存中),我会这样做。否则,我会使用 sendAsynchronousRequest 在后台下载它。

这是我的代码:

var image = self.imageCached[urlString] as? UIImage

if image {
cell.imageView.image = image

} else {

let request = NSURLRequest(URL: NSURL(string: urlString))
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), { response, data, error -> Void in

image = UIImage(data: data)
self.imageCached[urlString] = image;

dispatch_async(dispatch_get_main_queue(), {
cell.imageView.image = image
})
})
}

但是我还有一些不清楚的地方:

  1. NSURLConnection.sendAsynchronousRequest 正在后台执行任务,但 NSOperationQueue.mainQueue() 似乎在主线程中执行任务(因为名称“mainQueue”) ')。那么什么是真实的事情呢?指令中的 block 是在后台还是主线程?因为如果它在主线程上,就没有必要为了更新 UI 而回到主线程。

  2. 我听说 NSURLConnection 用于小的快速请求。真的是这样吗?因为当我使用 NSURLSession 而不是这个异步 NSURLConnection 请求来下载所有单元格图像时,它比 NSURLConnection 更长。

    那么什么时候应该使用NSURLConnection,什么时候使用NSURLSession呢? (例如:json 数据或来自 api 的快速登录检查)

  3. 此外,当我退出该应用程序时,系统缓存似乎可以正常工作。但如何呢?因为我只将图像存储在数组中。那么为什么关闭应用后,它似乎总是被缓存?

最佳答案

  1. queue 参数指定完成 block 将在哪个队列上运行,而不是网络操作将在哪个队列上执行。

    顺便说一句,这意味着在当前完成 block /闭包的实现中对主队列的额外分派(dispatch)是多余的。

    请注意,有点令人惊讶的是,imageWithData 本身(尤其是在图像很大的情况下)可能需要超过几毫秒的时间才能运行,这可能会导致可观察到(尽管非常轻微)如果您在主线程中执行 imageWithData,则在 UI 中卡顿。通常您甚至不会注意到这一点,但如果此代码位于表/ Collection View 中,则快速滚动就会看到它。因此,您可能希望使用 mainQueue 以外的操作队列作为网络请求的 queue 参数,然后保留将最终 UI 更新分派(dispatch)到 main 的代码队列。差异可能难以察觉,但如果您想让滚动如丝般顺滑,则需要考虑这一改进。这仅取决于此代码出现的上下文。

  2. 根据我的经验,NSURLSessionNSURLConnection 慢。我想知道(尤其是没有看到 NSURLSession 实现的代码),如果您的 NSURLSession 实现由于某种原因没有缓存。

    一般建议是,如果您需要支持 7.0 之前的 iOS 版本,您将使用 NSURLConnection,否则使用 NSURLSession

  3. 您看到的缓存是由 NSURLConnection 和/或 NSURLSession 透明提供的,完全独立于您可能使用的任何应用级缓存有效地处理您的数组。

关于ios - 网络 iOS : Background/MainThread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25104652/

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