CoreDataと画像(UIImage)

iphoneアプリを試すがてらバリバリ作っているので、CoreDataの話です。

画像をUIImageで取ってきた後、UIImageJPEGRepresentationとかでバイナリにすれば、CoreDataに保存できることは検索すると出てくる。


んで、こっからは自分で試したことなんだけど、UIImageJPEGRepresentationはNSDataなので、UIImage(data: Data)で復元する際に合わない。

でも、どうやら、NSDataとDataは互換性があるみたい。
なので、CoreDataへの保存は

let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "Book", in: context)
        self.book = NSManagedObject(entity: entity!, insertInto: context)
        book!.setValue(UUID().uuidString, forKey: "uuid")
        book!.setValue(self.textField.text, forKey: "name")
        book!.setValue(UIImageJPEGRepresentation(self.photoImageView.image!, 1), forKey: "image")
        do {
            try context.save()
        }catch{
            fatalError("Managed Object Saving Error.")
        }

こうで、復元は

let books:[NSManagedObject] = []
...
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "BookTableViewCell", for: indexPath) as! BookTableViewCell
        cell.bookLabel.text = self.books[indexPath.row].value(forKey: "name") as? String
        let imageData = self.books[indexPath.row].value(forKey: "image") as? Data
        if let data = imageData, let img = UIImage(data: data) {
            cell.bookimageView.image = img
        }else{
            fatalError("Can't convert to UIImage.")
        }

        return cell
    }

こんな風にDataでキャストして大丈夫みたい。
テンプレート的には、UIImageを取ってくる、UIImage◯◯◯Representationで変換、CoreDataにぶち込む、CoreDataからDataで持ってきて、これをUIImageのdataイニシャライザでUIImageに戻すという感じかな。