Я пишу приложение, в котором мне нужно отправить все содержимое адресной книги (а именно имена и номера) на сервер, на котором будет производиться пересечение, чтобы сообщить пользователю, на каких друзьях из его контактов установлено это приложениеих устройство (что-то похожее на большинство коммуникационных приложений в настоящее время).Моя проблема не в том, как это сделать, моя проблема в скорости и синхронизации между клиентами и сервером.
Чтобы извлечь имена и номера из адресной книги, я делаю простой цикл исохраните ответы в 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 байтов на одно сообщение.
Сейчаскак отправить эти контакты на сервер?Я подумал:
- Невозможно отправить все 15 000 символов одновременно в одном сообщении
- Отправка по одному (я имею в виду контакт по контакту) - очень медленный выбор, илиЯ могу сказать, что это нереальный выбор
- Разделите весь массив на куски по 2000 байт (это я и сделал) и отправьте их на сервер.Ну, теоретически это работает, но когда я попробовал это, я столкнулся с проблемой.Отправка 2000 байтов с iPhone на сервер происходит очень быстро, но сохранение полученных 2000 байтов на сервере в базе данных занимает около 3 секунд, и это приводит к потере сервером последующих контактов, отправленных клиентом ко временииз сохранения.
Есть предложения, как решить эту проблему?Есть ли способ загрузить всю адресную книгу в виде одного файла на сервер, и тогда сервер разрешит ее и выполнит свою работу?Большое спасибо заранее.