お世話になります。Swiftの初心者です。皆様のお知恵をお借りしたと思います。
swiftの手書きのデータ(PKDrawing)をRealmに保存しようとしています。
PKDrawingデータを直接保存する事ができないのでData型に変換し保存しています。
しかしRealmから取り出し、元に戻す(Data→PKDrawing)を行う時、エラーが発生します。
エラーがでる箇所(以下のloadの所で発生します)
let decodeDrawing = reDrawData.withUnsafeBytes{$0.load(as: PKDrawing.self)}
エラー内容
Thread 1: EXC_BAD_ACCESS (code=1, address=0xaf6a941e0)
試したこと
①Realmに保存、すぐに読出し、Data→PKDrawing変換をしてみたら、正常に動作します。(ボタンを1タップでrealm保存、読出しを行う)
②読出し専用のボタンの時にエラーが発生します。
①と②の読出し用の関数は同じです(getDrawing)
なにとぞご教授いただけますようお願い致します。
SWIFT
1class CanvasSaveModel : Object{ 2 @objc dynamic var id : String = "" //固有ID 3 @objc dynamic var name :String = "" //canvasの名前 4 @objc dynamic var drawData = Data() //Data型に変換したPKDrawing 5 override static func primaryKey() -> String? { 6 return "id" 7 } 8} 9//Realmから読出し&Data→PKDrawing変換コード 10func getDrawing(id: String)->PKDrawing? { 11 let realm = try! Realm() 12 let reCanvasSaveModel = realm.object(ofType: CanvasSaveModel.self, forPrimaryKey: id) 13 14 guard let _reCanvasSaveModel = reCanvasSaveModel else {return nil} 15 print("_reCanvasSaveModel(_reCanvasSaveModel)") 16 17 //drawingデータをstringからPKDrawingにする 18 let reDrawData = _reCanvasSaveModel.drawData 19 //Data→PKDrawing*****ここでエラーが出ます***** 20 let decodeDrawing = reDrawData.withUnsafeBytes{$0.load(as: PKDrawing.self)} 21 22 return decodeDrawing 23} 24 25//①のコード 26@objc func onSaveLoadButton(_ sender:UIButton){ 27 let canvasSaveModel = CanvasSaveModel() 28 //***********save*********** 29 //PKDrawingデータを文字列に変換し格納 30 var drawing = canvasFirst.drawing 31 //PKDrawing→Data 32 let drawingData = Data(bytes: &drawing, count: MemoryLayout.size(ofValue: drawing)) 33 canvasSaveModel.id = "1" 34 canvasSaveModel.name = "test" 35 canvasSaveModel.drawData = drawingData 36 37 //realmインスタンス 38 let realm = try! Realm() 39 40 //idがある場合は更新。ない場合は新規保存 41 try! realm.write({ 42 realm.add(canvasSaveModel,update: .modified) 43 }) 44 //id"1"を呼び出し 45 let reDrawing = getDrawing(id: "1") 46 47 if let reDrawing = reDrawing{ 48 self.cavasSecond.drawing = reDrawing 49 } 50} 51//②のコード 52@objc func onLoadButton(_ sender: UIButton){ 53 //id"1"を呼び出し 54 let reDrawing = getDrawing(id: "1") 55 if let reDrawing = reDrawing{ 56 self.cavasSecond.drawing = reDrawing 57 } 58}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。