objective-c - 如何使用AddressBook框架有效地从AddressBook中删除所有联系人?

标签 objective-c cocoa addressbook

我编写了如下代码,用于从地址簿中删除所有联系人。但对于超过 1000 个联系人,它的运行速度非常慢。有没有其他方法可以从地址簿中删除所有联系人。我需要它来恢复我的应用程序中的备份。

-(void)removeAllData
{   
ABAddressBook *book = [ABAddressBook sharedAddressBook];
int count = [[book people] count];

for(int i=count;i>=0;i--)
{

    if(i<[[book people] count])
    {
        [book removeRecord:[[book people] objectAtIndex:i]];
    }

}

[book save];
}

最佳答案

您可以首先在整个循环中只检索一次书中的人物,而不是每次迭代两次,然后通过使用 fast enumeration 直接在数组上循环来进一步改进这一点。而不是通过索引访问对象:

NSArray *people = [book people];
for (ABPerson *person in people)
    [book removeRecord:person];
[book save];

您还应该在 Instruments 中分析您的应用程序,看看还有什么可能占用您大量的时间。我预测(但您应该自己确认这一点)如果您分析当前的代码,[book people] 将显示为热点,因为您调用它的次数太多(2000 次) >计数 == 1000)。

(我假设您有充分的理由清空地址簿......)

关于objective-c - 如何使用AddressBook框架有效地从AddressBook中删除所有联系人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3083624/

相关文章:

ios - 如何在实时lldb控制台上打印UIView.transform

ios - 重构iOS项目以不使用 Storyboard

objective-c - Cocoa:拖动时不会触发任何键盘事件(NSEventTrackingRunLoopMode)

objective-c - 失去焦点并单击窗口的关闭按钮?

cocoa - 用于 IPAD 和 http post 查询到服务器的 Erply Inventory API 开发

macos - 如何在 NSTextView 上拖动鼠标左键时检测鼠标右键按下和其他鼠标按下?

ios - 将 iPhone 地址簿与后端服务器同步

permissions - iOS 6 移除通讯录权限入口

ios - 每次 utableview 重新加载时,单元格按钮都会不断创建新的

iphone - iphone 地址簿 ui Controller 的自定义行为