Ream--(objc)寫事務精簡方案 地址: REALM-- Realm官方提供的的寫事務有兩種方式: A[realm beginWriteTransaction]; // ... [realm commitWriteTransaction]; B [realm transactionWithBl ...
Ream--(objc)寫事務精簡方案
Realm官方提供的的寫事務有兩種方式:
A
[realm beginWriteTransaction]; // ... [realm commitWriteTransaction]; B [realm transactionWithBlock:^{ //... }];
由於realm強制線程安全,所以realm對象不適合持有。所以造成了realm寫事務面向realm編程,而不是面向RLMObject編程。或者說realm的面向過的程痕跡還沒消除乾凈,追求速度的realm由c++實現,realm選擇了速度放棄了一些便利。
這種編碼方式才是我們期望的
[object commitTransaction:^(object){ object.key = value; }];
常見的封裝策略都是圍繞AB兩種形式。圍繞A形式封裝的問題是代碼損耗大,作用域不直觀,並且中間不能return,B形式封裝的問題是誇閉包傳值代碼損耗大,調試原作用域浪費時間,不能return。
最理想的編碼方式是一行
{ @realm_writing; /// Begin commit object.key = value; } /// Commit when leava current scope.
這種編碼方式需要藉助析構函數,使用C++會要求所有.m文件修改為.mm。使用Objc in ARC,dealloc的執行存在延遲的可能,沒有C++完美。
退而求合適的方案是藉助autoreleasepool來實現dealloc立即執行。autoreleasepool在任何地方return都會完成pool的release。
{ @realm_writing_pool { object.key = value; } }