|
本帖最后由 moo.tinys 于 2011-12-9 10:34 编辑
7 Y6 Z3 D- M+ W7 }# P4 b
4 Z+ y! E/ f$ [背景知识: 来自 Accounts 同步过来的联系人的叫 Contact, 自动 link (包括1的情况)成 Person
1 ]9 u- b7 d4 d+ C背景知识2: edit 修改 contact, 查看是 person
3 \# Q' E# H3 u+ F! i- d. e可能有关的条件: 使用 1.4G 特殊内核后(也可能无关)' y6 h- _4 V) H) \4 s8 O
操作: 编辑联系人点done后, 展开 contacts
( G6 Z% u: W1 e% U% a9 j, z: M错误现象:
- c. z" q6 \( V6 x8 c7 w' ~ 1. 修改后 person 信息是修改后的, 点 app.contacts 的 Person 详细资料的顶部展开 contact, contact 信息是修改前的 (一般不展开, 所以此现象比较少留意到)
9 ]3 e. t8 Z2 c; g1 ? 2. 接着点击 edit 进行再修改, 看到的是老的 contact 信息 (现象很明显, 来回修改就会发现). w D: C6 y1 ~& c# r8 z
分析原因:' n7 k/ [' y' J/ E
a. 修改后, 系统先保存 person 后保存 contacts
+ ]6 A! ~6 R |, H% r b. person 的 detail view (查看详细资料) 界面在 watch person 数据库, 一旦修改就触发脚本执行 reloadContacts 重新载入 联系人, 此时 contacts 尚未被写入" @8 \3 F. n3 w7 W6 c9 E& _; x
" R& G5 Y* F E: O
其他罗嗦话: 以上确实从代码逻辑上分析出问题了. 而为何以前用 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& q1 Z3 H$ w, V$ w; `' P
因此即使没用超频内核, 也有一定概率出现, 因此修复后可更稳定
" S0 T g+ s% S. E7 |& |, l1 a/ a2 W( `& N, m# ]% U
补丁研发中 |
|