|
本帖最后由 moo.tinys 于 2011-12-9 10:34 编辑
7 r- T- ~5 v8 P8 |' X' t/ [
$ ?8 i7 `) n6 t5 _. L7 j0 @' f% i1 u背景知识: 来自 Accounts 同步过来的联系人的叫 Contact, 自动 link (包括1的情况)成 Person
+ H- D) W) G' I8 z, m h背景知识2: edit 修改 contact, 查看是 person% ^8 q' Z0 x. w: `; p- L. J
可能有关的条件: 使用 1.4G 特殊内核后(也可能无关)
& G; V/ o8 y9 m U* q4 ?' }4 \' p操作: 编辑联系人点done后, 展开 contacts
2 ] W1 T& a1 D3 S# P错误现象:8 q {! `% R/ t% M
1. 修改后 person 信息是修改后的, 点 app.contacts 的 Person 详细资料的顶部展开 contact, contact 信息是修改前的 (一般不展开, 所以此现象比较少留意到); Y4 q$ v, ~' ?( |
2. 接着点击 edit 进行再修改, 看到的是老的 contact 信息 (现象很明显, 来回修改就会发现)
+ ?8 M* g) n6 n) }分析原因:
% A3 j3 {$ U# A, H. }. T3 m a. 修改后, 系统先保存 person 后保存 contacts
/ W# {1 Q% O) f% H b. person 的 detail view (查看详细资料) 界面在 watch person 数据库, 一旦修改就触发脚本执行 reloadContacts 重新载入 联系人, 此时 contacts 尚未被写入
1 c H& D! V0 s4 z- E t4 k
0 [* m6 O; G8 A其他罗嗦话: 以上确实从代码逻辑上分析出问题了. 而为何以前用 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 的机制, 猜测应该是如此)
" b- k/ S; s+ |( K6 O7 d* ]因此即使没用超频内核, 也有一定概率出现, 因此修复后可更稳定% F* X5 d" ^/ N/ K$ V% L/ D
* P+ |! B/ e# H$ u补丁研发中 |
|