简化iOS下Realm写入事务的最佳解决方案

1,190 阅读2分钟

直接使用

Goto --> Github

开始阅读

解决痛点

痛点1.
  重复代码,本来增删改查一般两三行的,提交就占了2行,基本上代码量多一小半
[[RLMRealm defaultRealm] beginWriteTransaction];
    /// 修改数据库
[[RLMRealm defaultRealm] commitWriteTransaction];
痛点2. 
  这种方式体验比上方的好,但是多了block闭包,缺陷也不少,
如失去直接return方法的便利性,增加了跨域传值的过程,
尤其是弱引用使得循环引用的风险在不知不觉中增加。
而且在block内部也需要重复获取realm对象。
[[RLMRealm defaultRealm] transactionWithBlock:^{
	/// 修改数据库
}];

需要封装哪些功能?

  1. 写入事务的开启关闭
  2. realm对象的获取方式
  3. 写入事务避免嵌套

实现写入事务的开启关闭

  • 利用cleanup属性在作用域结束时自动执行函数的特性就可以实现自动关闭写入事务了,并且还不妨碍return,没有跨作用域传值。这是一个杠杆点非常高的技巧。

实现realm对象的获取方式

  • 利用宏定义轻松向作用域内提供固定的realm变量

实现写入事务避免嵌套

  • 这种复杂的判断下宏不能很优美的解决问题,我们需要引入自定义类型,该对象主要负责记录是否嵌套,然后将对应的情况封装封闭。

RealmLess的达成效果

  • 将一段普通的修改代码展示如下,可见我们已经基本上实现了只关心修改过程这一目标。
{ @realm_writing_scope
   person.name = @"10JQKA";
}

特别复杂的情况下,RealmLess的对生产效率的提高更加明显

{ @realm_writing_scope_with(OtherRealmObject)
	[rll_realm deleteObject:obj1];
	{ @realm_writing_scope_with(rll_realm)
   		[rll_realm addObject:obj2]; /// RealmLess在嵌套时修改立即生效
	}
    obj2 = [Obj2 objectWhere:...];
}