|
本帖最后由 moo.tinys 于 2011-12-9 10:34 编辑 - I5 x, s M: h7 F
- ]- T% c$ ? l- b8 u U5 s9 z背景知识: 来自 Accounts 同步过来的联系人的叫 Contact, 自动 link (包括1的情况)成 Person6 H2 l$ }6 X C, T+ k
背景知识2: edit 修改 contact, 查看是 person
7 l6 X6 j1 F( w5 ^! X8 {可能有关的条件: 使用 1.4G 特殊内核后(也可能无关)
3 g/ o3 q* p3 m9 s8 |8 z操作: 编辑联系人点done后, 展开 contacts7 k; j& K( ?- o7 @
错误现象:. v8 A2 t& ]- i7 b3 |
1. 修改后 person 信息是修改后的, 点 app.contacts 的 Person 详细资料的顶部展开 contact, contact 信息是修改前的 (一般不展开, 所以此现象比较少留意到)9 L( L6 e6 g' Z5 D* ]0 @; y
2. 接着点击 edit 进行再修改, 看到的是老的 contact 信息 (现象很明显, 来回修改就会发现)
]: Y' \5 }6 _1 Q) G2 a+ q/ B分析原因:7 M& M$ F5 o+ V* v V
a. 修改后, 系统先保存 person 后保存 contacts O: ]% i. B9 w
b. person 的 detail view (查看详细资料) 界面在 watch person 数据库, 一旦修改就触发脚本执行 reloadContacts 重新载入 联系人, 此时 contacts 尚未被写入
* n7 h/ G9 k% Y) a X$ t6 J* D4 m# m7 t
. `. D1 Y" O# q其他罗嗦话: 以上确实从代码逻辑上分析出问题了. 而为何以前用 2.1.2 没发现, 为何模拟器里的 2.1.0 没这个问题, 这些疑问尚未深入研究, 也不打算研究. 至少原因相关的代码并没有被补丁修改过, 甚至这部分代码 2.1.2 跟 2.1.0 是一样的. 只能怀疑是这里的确是 Race condition (竞争条件)说不定谁先谁后, 所以随即概率出问题. watch 跟 cpu 速度的变化暴露了这个问题. 保存 person/contacts 的过程是多个 Future.then 操作, Future 之间 db watch 事件可能先触发 (未深入分析 Future/dbwatch 的机制, 猜测应该是如此), r5 I h4 F- N1 g& e8 |
因此即使没用超频内核, 也有一定概率出现, 因此修复后可更稳定
: ?1 v. f; b g' e7 X
2 b& S' w& m, _3 C1 b! J6 L补丁研发中 |
|