Как человек, который является совершенно новым для Swift и CoreData, я уверен, что я собираюсь сделать это неправильно и надеюсь, что кто-то сможет помочь.iOS Swift CoreData Асинхронная загрузка данных изображения
Справочная информация: Я загружаю JSON по API и кеширую содержимое локально на 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)
}
I-й ан называют код таким образом:
downloadImage(imgURL, coreDataEntity, moc, { (image, cdEntity, moc, error) -> Void in
setImage(image, cdEntity, moc, error)
})
Делая это, я не получаю никаких блоков в основном потоке, что я замечаю. Проверяя файл sqlite с устройства, похоже, что данные устанавливаются правильно, но изображения не отображаются в пользовательском интерфейсе.
Является ли мой метод совершенно неправильным? Если нет, как я могу сообщить пользовательскому интерфейсу, что базовая модель данных была обновлена таким образом, чтобы вызвать обновление? Какую функцию можно вызвать для обновления определенной строки/ячейки таблицы/uicollectionview?
"и кэширование контента локально на iPad в CoreData". Errr ... почему? Система загрузки URL-адресов уже обрабатывает кеширование. Если вы хотите, чтобы кэшированные данные сохранялись на диске, все, что вам нужно сделать, это включить его. См. Документацию для «NSURLCache». – quellish
Я рад исследовать альтернативные варианты кеширования, но URL-адрес, указывающий на изображение (хранящийся на S3), скорее всего, изменится по мере создания новых токенов, предоставляющих доступ к нему. Мое предположение заключалось в том, что это приведет к аннулированию NSURLCache. – djbp