繁体   English   中英

iOS Swift CoreData图像数据的异步下载

[英]iOS Swift CoreData Asynchronous Downloading of Image Data

作为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的特定行/单元格?

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

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

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

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

如果不是,我如何通知UI核心数据模型已经过更新,将导致刷新? 可以调用什么函数来更新表/ uicollectionview的特定行/单元格?

通常,这可以使用NSFetchedResultsController来完成,该NSFetchedResultsController观察托管对象上下文中与获取请求有关的更改。 初始提取操作填充到控制器后,它将监听对上下文的更改,这些更改会影响获取请求所指定的对象。 当发生相关更改时,控制器通过回调通知其委托。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM