|
本帖最后由 moo.tinys 于 2011-12-9 10:34 编辑 # \: ]' l3 L+ {/ B3 I
6 E j! ]0 I& e6 Q背景知识: 来自 Accounts 同步过来的联系人的叫 Contact, 自动 link (包括1的情况)成 Person5 v! y/ d( y: f7 [
背景知识2: edit 修改 contact, 查看是 person
1 g. t' a( n- b$ X% g3 c( B% U可能有关的条件: 使用 1.4G 特殊内核后(也可能无关)
3 K q/ E+ V- I' N3 H2 q操作: 编辑联系人点done后, 展开 contacts! [6 d% v+ U1 h# d8 K! h T
错误现象:3 \0 D& |% c X! b+ b' M
1. 修改后 person 信息是修改后的, 点 app.contacts 的 Person 详细资料的顶部展开 contact, contact 信息是修改前的 (一般不展开, 所以此现象比较少留意到)
5 p/ M# Z5 I) R, }8 B 2. 接着点击 edit 进行再修改, 看到的是老的 contact 信息 (现象很明显, 来回修改就会发现)+ q/ C* s$ s+ t: o( |1 ~; F
分析原因:
% x3 W5 a! e3 H8 s: a3 P1 [& E6 _ a. 修改后, 系统先保存 person 后保存 contacts% U' B; w& ?" }. J; m
b. person 的 detail view (查看详细资料) 界面在 watch person 数据库, 一旦修改就触发脚本执行 reloadContacts 重新载入 联系人, 此时 contacts 尚未被写入- y6 F. k4 N! _' T, W3 u$ o$ t
) S8 t; f; z- ~4 }9 \, N6 c! ~其他罗嗦话: 以上确实从代码逻辑上分析出问题了. 而为何以前用 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 的机制, 猜测应该是如此)9 z% b$ ?5 P( S
因此即使没用超频内核, 也有一定概率出现, 因此修复后可更稳定% w5 o9 s5 w. L7 K4 B
6 y# ~( i/ Y) D0 |4 _- w6 Q
补丁研发中 |
|