GroupMe Контакты | Адресная книга - PullRequest
7 голосов
/ 06 ноября 2011

Я хочу построить ContactsTableViewController, как у GroupMe .Он отображает все контакты моей адресной книги и даже те, которые являются пользователями GroupMe.

enter image description here

Кажется, что ABPeoplePickerNavigationController нельзя настроить .

  1. Итак, если я получу доступ к контактам из адресной книги с помощью ABAddressBook & ABPerson, как лучше всего отобразить их с помощью пользовательского UITableViewController?

    Я не хочу простозагрузите все контакты адресной книги в NSArray, потому что это может убить память (я знаю людей, у которых тысячи контактов из адресной книги на их телефонах).Я привык использовать Core Data & NSFetchedResultsController для больших наборов результатов, как это.Но для этого мне нужно было бы создать ABPerson модель в Core Data, что было бы легко, но синхронизировать ее с адресной книгой кажется сложным и глупым.

  2. Каков наилучший способ связать контакты GroupMe с контактами адресной книги?

  3. Есть ли что-то еще, что я должен знать / учитывать при попытке воссоздать этот интерфейс в стиле GroupMe?

1 Ответ

20 голосов
/ 07 ноября 2011

Я один из разработчиков iOS для GroupMe, и это то, что мы делаем.

  1. Мы сканируем адресную книгу пользователей и сохраняем ее в Core Data.У нас есть объект Contact, который имеет 1-ко-многим против телефонных номеров и 1-ко-многим по адресам электронной почты.Первое сканирование может занять немного времени, если имеется много контактов, но при каждом последующем сканировании мы игнорируем любые ABRecordRef, которые имеют kABPersonModificationDateProperty до нашего последнего сканирования.Это значительно ускоряет обновления.

  2. Затем, предположив, что пользователь выбрал синхронизацию контактов, мы загружаем номера телефонов и адреса электронной почты на наш сервер, которые будут сопоставляться с существующими пользователями GroupMe.

  3. Наконец, мы извлекаем отношения GroupMe на основе совпадений (с телефона, электронной почты, Facebook, Twitter) и сохраняем их в Базовых данных.Если связь была установлена ​​из-за того, что телефон / электронная почта уже существует в адресной книге пользователя, мы передаем эти значения обратно в связи, чтобы мы могли создать связь 1: 1 между связью GroupMe и контактом, который мы сохранили в Базовых данных вШаг 1. Таким образом, мы можем легко создать NSFetchRequest s для локальных контактов или отношений GroupMe и иметь подробные сведения об их отношениях в любой точке (поэтому мы можем показать, что локальный контакт является пользователем GroupMe и т. д. - как Аарон Г. вваш скриншот)

Мы также используем NSFetchedResultsController, чтобы мы могли получать обновления, отраженные в пользовательском интерфейсе, если наши фоновые операции обнаружат какие-либо новые контакты / отношения ..

Единственные другие советы - убедиться, что ваш запрос на выборку предварительно выбрал все отношения, чтобы причины загрузки не затрагивали основные данные при прокрутке для заполнения ошибок.

И да, сохраняя ваши основные данные nсинхронизация с адресной книгой пользователя более утомительна, чем глупа, это того стоит, чтобы вы моглиДоступ к нему и для запросов, которые должны знать весь этот джаз.

...