В общем: простого пути нет. Но я обрисую подход.
Если вас не волнуют изменения, которые будут перезаписаны: сохраняйте отметку времени самого последнего изменения для каждой записи и отметку времени каждой синхронизации. При синхронизации вы получаете список всех обновлений на iPhone с момента последней синхронизации и всех обновлений на сервере. Вы пишете с iPhone на сервер, если отметка времени iPhone для этой записи новее, чем на сервере, и наоборот.
Но тебе, наверное, все равно. Скажем, вы отредактировали заметку под названием «Где встретиться в пятницу». Это началось пустым. Теперь по телефону вы написали: «Мой дом». Десять минут спустя ваш друг редактирует ту же заметку на сервере и пишет: «Закусочная». Кто победит? Переполнение стека не может ответить за вас; это зависит от приложения.
ОК, поэтому измените подход, описанный выше: если и версия сервера записи, и локальная версия были отредактированы с момента последней синхронизации, вы должны спросить пользователя, что делать. Это основной алгоритм.
Если вас очень волнуют изменения, которые не будут перезаписаны, до такой степени, что вы хотите объединить изменения в разных местах в одних и тех же документах, то ваша система начнет приближаться к сложности систем контроля версий, таких как Subversion или Git. Совсем не просто.