gpt4 book ai didi

iOS Swift CoreData 异步下载图片数据

转载 作者:行者123 更新时间:2023-11-28 05:31:27 25 4
gpt4 key购买 nike

作为一个刚接触 Swift 和 CoreData 的人,我确信我的做法是错误的,希望有人能提供帮助。

背景:我正在通过 API 下载 JSON,并将内容缓存在 iPad 的本地 CoreData 中。作为该过程的一部分,我需要下载一个小图像缩略图,我也将其存储在 CoreData 中(作为 Transformable)。

我在做:我最初的实现下载图像并将它们保存到 CoreData,但是尽管它是从后台线程触发的(API 调用后的回调),但实际下载图像似乎导致应用程序挂起:

let data = NSData(contentsOfURL: imgURL)
if let imageData = data {
coreDataEntity.thumbnail = imageData
}

我现在在做什么:我已将我的代码更新为以下内容:

func downloadImage(url: NSURL, cdEntity: CoreDataEntity, moc: NSManagedObjectContext, handler: ((image: UIImage?, cdEntity: CoreDataEntity, moc: NSManagedObjectContext, NSError!) -> Void))
{
var imageRequest: NSURLRequest = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(imageRequest,
queue: NSOperationQueue.mainQueue(),
completionHandler: {response, data, error in
handler(image: UIImage(data: data), cdEntity: cdEntity, moc: moc, error)
})
}

func setImage(image: UIImage?, cdEntity: CoreDataEntity, moc: NSManagedObjectContext, error: NSError?) {
cdEntity.thumbnail = image
save(moc)
}

然后我这样调用代码:

downloadImage(imgURL, coreDataEntity, moc, { (image, cdEntity, moc, error) -> Void in
setImage(image, cdEntity, moc, error)
})

这样做,我没有注意到主线程上有任何 block 。从设备检查 sqlite 文件,数据似乎已正确设置,但图像未显示在 UI 中。

难道我的方法完全错了吗?如果没有,我如何通知 UI 核心数据模型已经更新,从而导致刷新?可以调用什么函数来更新表/uicollectionview 的特定行/单元格?

最佳答案

  1. 您的 NSURLConnection 的回调发生在主队列上。这是您的应用程序被锁定的原因之一。

  2. 您的托管对象上下文,至少在您发布的代码中,没有遵循 Core Data 并发规则。您可以在线程限制(不幸的是,默认设置已过时)和队列限制之间进行选择。

有了线程限制,您只能使用创建它的线程中的托管对象上下文。如果您在主线程(或队列)上创建了托管对象上下文,您只能从那里使用它 - 因此您在该上下文上执行的任何 Core Data 操作都会阻塞主线程,进而阻塞 UI。

使用队列限制(几乎)对托管对象上下文的任何操作都必须通过 performBlock:performBlockAndWait: 方法。排队的 block 在上下文的串行队列上执行。这比线程限制更不容易出错,并且自 iOS 5 以来一直是推荐的并发做法。

If not, how can I inform the UI that the core data model has been updated in such a way that will cause a refresh? What function can be called to update a specific row/cell of a table/uicollectionview?

通常这将使用 NSFetchedResultsController 来完成,它观察托管对象上下文以获取与其获取请求相关的更改。一旦初始提取填充 Controller ,它将监听对影响提取请求指定对象的上下文的更改。当发生相关更改时, Controller 通过回调通知它的委托(delegate)。

关于iOS Swift CoreData 异步下载图片数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28026848/

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