Я один из разработчиков iOS для GroupMe, и это то, что мы делаем.
Мы сканируем адресную книгу пользователей и сохраняем ее в Core Data.У нас есть объект Contact, который имеет 1-ко-многим против телефонных номеров и 1-ко-многим по адресам электронной почты.Первое сканирование может занять немного времени, если имеется много контактов, но при каждом последующем сканировании мы игнорируем любые ABRecordRef
, которые имеют kABPersonModificationDateProperty
до нашего последнего сканирования.Это значительно ускоряет обновления.
Затем, предположив, что пользователь выбрал синхронизацию контактов, мы загружаем номера телефонов и адреса электронной почты на наш сервер, которые будут сопоставляться с существующими пользователями GroupMe.
Наконец, мы извлекаем отношения GroupMe на основе совпадений (с телефона, электронной почты, Facebook, Twitter) и сохраняем их в Базовых данных.Если связь была установлена из-за того, что телефон / электронная почта уже существует в адресной книге пользователя, мы передаем эти значения обратно в связи, чтобы мы могли создать связь 1: 1 между связью GroupMe и контактом, который мы сохранили в Базовых данных вШаг 1. Таким образом, мы можем легко создать NSFetchRequest
s для локальных контактов или отношений GroupMe и иметь подробные сведения об их отношениях в любой точке (поэтому мы можем показать, что локальный контакт является пользователем GroupMe и т. д. - как Аарон Г. вваш скриншот)
Мы также используем NSFetchedResultsController
, чтобы мы могли получать обновления, отраженные в пользовательском интерфейсе, если наши фоновые операции обнаружат какие-либо новые контакты / отношения ..
Единственные другие советы - убедиться, что ваш запрос на выборку предварительно выбрал все отношения, чтобы причины загрузки не затрагивали основные данные при прокрутке для заполнения ошибок.
И да, сохраняя ваши основные данные nсинхронизация с адресной книгой пользователя более утомительна, чем глупа, это того стоит, чтобы вы моглиДоступ к нему и для запросов, которые должны знать весь этот джаз.