【发布时间】:2015-01-19 14:25:56
【问题描述】:
作为一个对 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)
})
这样做,我注意到主线程上没有任何块。从设备检查 sqlite 文件,看起来数据设置正确,但图像未显示在 UI 中。
我的方法完全错误吗?如果不是,我如何通知 UI 核心数据模型已以导致刷新的方式更新?可以调用什么函数来更新表格/uicollectionview的特定行/单元格?
【问题讨论】:
-
"并在 CoreData 中将内容本地缓存到 iPad 上。"呃……为什么? URL 加载系统已经在为您处理缓存。如果您想将缓存的数据持久化到磁盘,您只需将其打开即可。请参阅
NSURLCache的文档。 -
我很高兴研究替代缓存选项,但指向图像(存储在 S3 上)的 URL 可能会随着新令牌的生成而发生变化以授予对它的访问权限。我的假设是这会使 NSURLCache 无效。
标签: ios multithreading swift core-data