🤖

MR_contextForCurrentThreadはdeprecated

2021/12/29に公開

ここによると、MagicalRecord 3.0 になったら削除されるみたいですね。

そこで、他の方法を模索してみることに。

MagicalRecord / CoreData歴が浅いのでよくわからないけどメモしておく。

saveだけ

before

XXXObject.swift
func save() {
  let localContext = MR_contextForCurrentThread()
  let obj = MR_createInContext(localContext) as XXXObject
  obj.hoge = "hoge"
  localContext.MR_saveToPersistentStoreAndWait()
}

after

func save() {
  MagicalRecord.saveWithBlockAndWait {
    (localContext) in
    let obj = MR_createInContext(context) as XXXObject
    obj.hoge = "hoge"
  }
}

こんな感じで書けばいいのかな?

saveしてreturn

このパターンは正直よくわからない。

before

XXXObject.swift
func saveAndReturn() -> XXXObject {
  let localContext = MR_contextForCurrentThread()
  let obj = MR_createInContext(localContext) as XXXObject
  obj.hoge = "hoge"
  localContext.MR_saveToPersistentStoreAndWait()
  return obj
}

そもそも、これをそのままreturnしていいのかわからないけどこのスレッド内ではデータは使えるはず。

after

XXXObject.swift
// identifierというフィールドを用意して主キー的に使う
override func awakeFromInsert() {
  super.awakeFromInsert()
  identifier = NSUUID().UUIDString
}

func saveAndReturn() -> XXXObject {
  var identifier: String!
  MagicalRecord.saveWithBlockAndWait {
    (localContext) in
    let obj = MR_createInContext(context) as XXXObject
    obj.hoge = "hoge"
    identifier = obj.identifier
  }
  return MR_findFirstByAttribute("identifier", withValue: identifier)
}

findしなおしているのがダサいか…。

Discussion