【发布时间】:2013-10-01 10:01:44
【问题描述】:
我正在使用以下多对多模型进行项目:
Book:可以有多个标签(book.tags) 标签:可以包含很多书(tag.books)
我发现当一本书已经在数据库中时,我只想通过[bookMO addTagsObject:tag] 为该书添加一个标签,我会在 book.tags 中遇到错误。使用仪器,我发现核心数据正在尝试做“[NSObject(NSKeyValueObserver(Notification) willChangeValueForKey:withSetMutation:usingObjects]”。
我还检查了实际执行的 sql,我发现:
注释:objectID 0x20140b00 的一对多关系错误“标签”从数据库中完成。
然后是一个 sql 查询,它返回包含这本书的所有标签。我发现内部核心数据使用 Book 和 Tag 的连接表。该连接表的主键只是book_id and tag_id 的组合。该联合表未编入索引。并且要获取包含一本书的所有标签,似乎(我在这里不确定)遍历该联合表中的所有行,因此此操作非常昂贵。
我认为我的应用程序现在发生的情况是,每次我想为一本书添加标签时,我都必须在联合表中进行线性扫描。总体复杂度为O(N^2),因为每个操作都会在连接表中进行线性扫描。而且我现在有10k本书,性能不太好..
有什么办法可以避免 kvo 触发的tags 故障?或者有什么方法可以实现我自己的连接表,可以通过索引返回O(1) 中的结果?
-尔本
【问题讨论】:
标签: iphone ios objective-c core-data key-value-observing