|
本帖最后由 moo.tinys 于 2011-12-9 10:34 编辑 [# ]! b; D3 G% ^3 H$ m
. k/ ]+ B) ^. I* M) y
背景知识: 来自 Accounts 同步过来的联系人的叫 Contact, 自动 link (包括1的情况)成 Person
4 Y- V7 D$ U3 |5 F2 A; H背景知识2: edit 修改 contact, 查看是 person
6 {/ ]6 d p6 T( h3 z可能有关的条件: 使用 1.4G 特殊内核后(也可能无关)3 `9 U$ w0 U- e) F3 g
操作: 编辑联系人点done后, 展开 contacts. t6 [& }: S, D8 K
错误现象:4 u- K( {4 E+ L; ]3 J
1. 修改后 person 信息是修改后的, 点 app.contacts 的 Person 详细资料的顶部展开 contact, contact 信息是修改前的 (一般不展开, 所以此现象比较少留意到)( a6 v) i4 U+ c7 ]5 B) A
2. 接着点击 edit 进行再修改, 看到的是老的 contact 信息 (现象很明显, 来回修改就会发现)
F7 _+ ?' C$ K0 b" |$ O8 E分析原因:: ~ N$ I9 h8 Y
a. 修改后, 系统先保存 person 后保存 contacts
* s# ]2 y% ~+ ` b. person 的 detail view (查看详细资料) 界面在 watch person 数据库, 一旦修改就触发脚本执行 reloadContacts 重新载入 联系人, 此时 contacts 尚未被写入
' K) j) i% ^ ]& a: x% S
1 J9 L$ V4 J% S' 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 的机制, 猜测应该是如此)
* A4 I0 X% I" l7 J. e. A \( H# f因此即使没用超频内核, 也有一定概率出现, 因此修复后可更稳定
+ o/ O( [' V5 L4 `- _' a1 |, s0 V# p- V
补丁研发中 |
|