Как быстро отправить все содержимое адресной книги на сервер - PullRequest
3 голосов
/ 29 января 2012

Я пишу приложение, в котором мне нужно отправить все содержимое адресной книги (а именно имена и номера) на сервер, на котором будет производиться пересечение, чтобы сообщить пользователю, на каких друзьях из его контактов установлено это приложениеих устройство (что-то похожее на большинство коммуникационных приложений в настоящее время).Моя проблема не в том, как это сделать, моя проблема в скорости и синхронизации между клиентами и сервером.

Чтобы извлечь имена и номера из адресной книги, я делаю простой цикл исохраните ответы в NSMutableArray следующим образом:

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

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

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

    int multiCount = ABMultiValueGetCount(multi);
    for(CFIndex j=0; j<multiCount; j++)
    {
        number = (NSString *)ABMultiValueCopyValueAtIndex(multi, j);
        [arrayNamesToSend addObject:[NSString stringWithFormat:@"%u;%@;%@;", contactID, fullName, number];];
    }
}

Ну, этот цикл заканчивается примерно за одну секунду (максимум 2 секунды, даже если у вас более 1000 контактов).Давайте поговорим о среднем случае: в адресной книге в среднем может быть 500 имен, каждое имя длиной в среднем 15 символов, а каждый номер телефона в среднем 15 символов (в международном формате), поэтому это приводит квсего 15 000 символов для отправки на сервер.Исходя из моих скромных знаний в области программирования клиент-сервер, не рекомендуется отправлять большое количество байтов в одном сообщении от клиента на сервер, и рекомендуемые размеры составляют от 1024 до 4096 байтов на одно сообщение.

Сейчаскак отправить эти контакты на сервер?Я подумал:

  1. Невозможно отправить все 15 000 символов одновременно в одном сообщении
  2. Отправка по одному (я имею в виду контакт по контакту) - очень медленный выбор, илиЯ могу сказать, что это нереальный выбор
  3. Разделите весь массив на куски по 2000 байт (это я и сделал) и отправьте их на сервер.Ну, теоретически это работает, но когда я попробовал это, я столкнулся с проблемой.Отправка 2000 байтов с iPhone на сервер происходит очень быстро, но сохранение полученных 2000 байтов на сервере в базе данных занимает около 3 секунд, и это приводит к потере сервером последующих контактов, отправленных клиентом ко временииз сохранения.

Есть предложения, как решить эту проблему?Есть ли способ загрузить всю адресную книгу в виде одного файла на сервер, и тогда сервер разрешит ее и выполнит свою работу?Большое спасибо заранее.

1 Ответ

9 голосов
/ 31 января 2012

Это ДЕЙСТВИТЕЛЬНО ПЛОХАЯ ИДЕЯ .Вы нарушаете всевозможные проблемы конфиденциальности, отправляя данные адресной книги на сервер.И более того, вам это не нужно .Что вам нужно сделать, это хэшировать все данные, которые вас интересуют (используя что-то вроде SHA1 или, возможно, HMAC просто для безопасности) и отправлять хэши на сервер.Вы можете проводить сравнения, используя хеши, так же, как и необработанные данные, но таким образом у вас нет серьезных проблем с конфиденциальностью, присущих отправке реальных личных данных на ваш сервер.


В любом случае, ваш реальный вопрос касается отправки большого количества данных на сервер.Я думаю, что ваши опасения неоправданны.Что не так с отправкой всех данных в виде одного «сообщения»?Похоже, у вас есть только 15 КБ или около того данных.Это действительно не так уж и много.Если бы вы отправляли хотя бы одно изображение на сервер, вы бы достигли такого размера.

...