首先感謝掘金 貓d 的推薦,很多朋友關注了我,由於剛開始寫技術文章,並沒有寫出什麼真正的乾貨,深感愧疚。
今天討論的是 core data 資料遷移中的一些細節問題,參閱了不少資料,進行了反覆的驗證,可以說填上了不少坑。
本文討論的範圍僅限於自動觸發的自定義遷移情況,其他情況後續再補充。
在遷移測試前,先將原資料進行備份:
對映模型中的value expression
,實際上是n***pression
型別值,因此要按照n***pression
的規則來寫。它可以進行簡單的數**算(數字型別屬性),如$source.*** + 10
;也可以使用類似於 kvc 中的 keypath,如$source.***.yyy
,但使用 keypath 的方式要注意,***
必須為 nsobject 的子類,在 swift 中使用需注意,另外如果***
為集合型別,還可以使用集合操作符,使用方式參考 kvc 的集合操作。
對於yyy
的型別有乙個要注意,如果要對映的***
屬性型別是data
或transformable
型別,並且實際儲存的是自定義類的情況,那麼yyy
只能引用***
中的儲存屬性或例項方法(不帶引數,帶引數的見下一條function
使用),如果直接引用計算屬性則會出錯(因為實際儲存中並沒有這個值),但引用計算屬性的get
方法是可以的,如有乙個計算屬性是property
,那麼應該再提供乙個getproperty()
的方法,再使用$source.***.getproperty
引用。
屬性對映還有乙個方法就是使用function(object, selector, parameter...)
,類似objc_msgsend
語法,其中object
代表遷移過程中可以使用到的物件,例如以下幾個都是 core data 預設的 key,selector
代表object
擁有的方法指標,parameter
為具體引數:
// core data 預設的 key
nsmigrationmanagerkey: $manager
nsmigrationsourceobjectkey: $source
nsmigrationdestinationobjectkey: $destination
nsmigrationentitypolicykey: $entitypolicy
複製**
其中selector
的寫法需要非常注意,在 swift 中如果你的方法是 combine(firstname:string, lastname: string),那麼在 function 中就要寫成combinewithfirstname:lastname:
,中間要加 "with",objc 中應該也是類似。如果第乙個引數名是with
或from
(第乙個字母均為小寫),或者方法名以with
、from
結尾(注意第乙個字母要大寫),那就不用再加with
,如果不是這種命名方式,編譯時程式就會在第乙個引數名前自動加上with
進行匹配。如果不確定怎麼寫方法名,可以在 playground 中列印出來,如:
class
test
}print(#selector(test.combine(firstname:lastname:))) // combinewithfirstname:lastname:
複製**
final
class
v1to2policy: nsentitymigrationpolicy
// 獲取原始屬性值
let newvalue = .... // 計算對映後的屬性值
guard
let newitem = manager.destinationinstances( // 獲取對映後的新物件
sourceinstances: [sinstance]).first else
newitem.setvalue(newvalue, forkey: "***") // 設定新物件的屬性值
}}複製**
// ios 10 及以上寫法
container.persistentstoredescriptions[0].shouldmigratestoreautomatically = true
// ios 10 以下寫法
let options = [nsmigratepersistentstoresautomaticallyoption: true,
do catch
複製**
core data 還有很多說不完的話題,慢慢來吧。
題圖:zigzag - la_paupiette_masquee @unsplash
c 拾遺 處理資料
1 變數命名規則 按照倒數第二點方式進行命名不會導致編譯器錯誤,但會導致不確定性。而最後一點某些平台有長度限制 2 cout十進位制輸出其他進製 cout預設通過十進位制顯示,cout include int main 3 const與 define 使用const是定義乙個常值變數,一般格式為co...
asp知識拾遺
最近做的乙個小 碰到了許多問題,能解決的都解決了,還有的沒辦法就找了替代的解決辦法.下面收集一下 1 在選擇了一系列的checkbox後的提交表單提交後,會獲取到name1,逗號,空格,name2,逗號,空格,結果,系統需要獲取這些值,我用了以下 實現.uname request.form user...
Linux同步拾遺
一般情況下,執行緒在主題函式退出的時候會自動終止,但同時也可以因為接收到另乙個執行緒發來的終止請求而強制終止。執行緒取消的方法是向目標執行緒發cancel訊號,但如何處理cancel訊號則由目標執行緒自己決定,或者忽略,或者立即終止,或者繼續執行到cancelation point 取消點 由不同c...