Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何像其他应用程序(如Viber、Whatsapp等)一样快速阅读通讯簿_Iphone_Ios_Client Server_Addressbook - Fatal编程技术网

Iphone 如何像其他应用程序(如Viber、Whatsapp等)一样快速阅读通讯簿

Iphone 如何像其他应用程序(如Viber、Whatsapp等)一样快速阅读通讯簿,iphone,ios,client-server,addressbook,Iphone,Ios,Client Server,Addressbook,我正在写一个应用程序,我需要阅读地址簿数据来搜索一些感兴趣的联系人,类似于现在许多应用程序所做的(如Viber、Whatsapp、Tango…)。我需要进行匹配,以便将数据发送到服务器并回复到客户端,哪些联系人的设备上安装了相同的应用程序 我在想法的逻辑或机制上没有问题,我的问题是速度!我可以做我想做的事情,但在装有500个联系人的iPhone4上完成这个过程花了27秒。在同一台设备上,如果我们尝试Viber或Whatsapp(或任何类似的应用程序),这个过程只需不到5秒钟 我的方法非常简单,我

我正在写一个应用程序,我需要阅读地址簿数据来搜索一些感兴趣的联系人,类似于现在许多应用程序所做的(如Viber、Whatsapp、Tango…)。我需要进行匹配,以便将数据发送到服务器并回复到客户端,哪些联系人的设备上安装了相同的应用程序

我在想法的逻辑或机制上没有问题,我的问题是速度!我可以做我想做的事情,但在装有500个联系人的iPhone4上完成这个过程花了27秒。在同一台设备上,如果我们尝试Viber或Whatsapp(或任何类似的应用程序),这个过程只需不到5秒钟

我的方法非常简单,我做了一个for循环并读取所有内容。我怎样才能像其他应用程序一样做同样的事情,但速度要快得多

以下是我使用的代码:

    //variable definitions
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault, CFArrayGetCount(people), people);

    //sort the contents of the Mutable Array
    CFArraySortValues(peopleMutable, CFRangeMake(0, CFArrayGetCount(peopleMutable)), (CFComparatorFunction) ABPersonComparePeopleByName, (void*) ABPersonGetSortOrdering());

    //read the Address Book
    NSString *fullName, *number;
    ABRecordRef record = ABPersonCreate();
    ABMutableMultiValueRef multi;
    int contactID;
    int nameCount=0;//used to count the names in the string to send to server
    NSMutableString *strNamesToSend = [[NSMutableString alloc] init];

    for(CFIndex i=0; i< CFArrayGetCount(people); i++)
    {
        record = CFArrayGetValueAtIndex(people, i);
        multi = ABRecordCopyValue(record, kABPersonPhoneProperty);

        //Contact ID
        contactID = (int)ABRecordGetRecordID(record);

        //Full Name
        fullName = [NSString stringWithFormat:@"%@ %@", (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)];
        fullName = [fullName stringByReplacingOccurrencesOfString:@" (null)" withString:@""];

        //fill data into AddressBook Table
        if(dbOpen == SQLITE_OK)
        {
            //pure sqlite3 work to save the names in my app
        }

        //Get multiple numbers from each user (if any)
        for(CFIndex j=0; j<ABMultiValueGetCount(multi); j++)
        {
            number = (NSString *)ABMultiValueCopyValueAtIndex(multi, j);

            nameCount++;

            //fill data into AllNumbers Table
            if(dbOpen == SQLITE_OK)
            {
                 //another sqlite3 work to save the numbers
            }
        }

        //send to the server every 29 numbers so we don't send all the 500 numbers at once
        if(nameCount > 29)
        {
            //send to server
        }
//变量定义
ABAddressBookRef addressBook=ABAddressBookCreate();
CFArrayRef people=abAddressBookCopyArrayFallPeople(地址簿);
CFMutableArrayRef-peopleMutable=CFArrayCreateMutableCopy(kCFAllocatorDefault,CFArrayGetCount(people),people);
//对可变数组的内容进行排序
CFArraySortValues(peopleMutable,CFRangeMake(0,CFArrayGetCount(peopleMutable)),(CFComparatorFunction)abPersonCompareOpleByName,(void*)ABPersonGetSortOrdering();
//读地址簿
NSString*全名,*编号;
ABRecordRef record=ABPersonCreate();
ABMULTABLE多值REF multi;
int contactID;
int namecont=0//用于计算要发送到服务器的字符串中的名称
NSMutableString*strNamesToSend=[[NSMutableString alloc]init];
对于(CFIndex i=0;i对于(CFIndex j=0;j您是否尝试过分析您的代码?分析程序应该能够快速识别代码中缓慢的部分

从一个非常简单的检查中,我注意到您在每次迭代中计算数组大小,而不是只计算一次。请将其移出循环:

int count = CFArrayGetCount(people);
for (CFIndex i = 0; i < count; i++)
int count=CFArrayGetCount(人);
对于(CFIndex i=0;i
您不会详细说明正在进行的SQL调用,但您正在检查
SQLITE_OK
这一事实意味着您每次都在通过循环打开数据库。如果是这种情况,您应该将此调用移到循环之外,而不是每次都打开数据库


我注意到,
nameCount
没有被重置,这意味着一旦它达到29,您的if案例每次都会被命中,导致大量的网络请求。

您是否对其进行了分析,以查看这段时间花在了哪里?您是否将数据同步发送到服务器?我将尝试将计数移到阵列之外并删除它SQLITE_OK问题。变量nameCount正在重置,但为了尽量减少代码发布,我省略了这一部分。它在最后一个if语句中重置。我认为我不理解什么是探查器。我将用当前消耗的新时间更新您,谢谢:)顺便说一句,我省略了数据库部分,因为它非常基本,但是如果您觉得有必要,我将发布它。Re.“我想我不明白什么是分析器”,这是Instruments提供的最强大的工具之一。请尝试其中的一个以了解详细信息。这将向您展示代码中缓慢的部分。我将尝试教程并更新您。再次非常感谢。哇,这真是一个强大的工具。我尝试了时间分析器,虽然我对分析器的内容不熟悉,但我看到有5或6项至少,我们花费了很多时间,而且所有人都有
sqlite3
这个词!看来我做得不好的是将信息保存在Documents应用程序文件夹中,这让我了解到,可能其他应用程序不存储这些信息(我正在地址簿中存储所有联系人的姓名和号码)。真的@jnic非常感谢这条建议,它可能会解决我的整个问题:)我会在我的程序中进行更改并发布结果。