2016-05-23 2 views
0

Я сопоставляю свои объекты с ObjectMapper, которые доставляются Alamofire и сохраняются в Realm.ObjectMapper + Realm + Alamofire

Everthing работает нормально. Но как я могу удалить объекты, существующие в Realm, но были удалены в моем веб-сервисе?

Update: На основании ответа ниже я в настоящее время закончилась с этим кодом:

if let overviewItemsArray = response.result.value{ 

        do{ 
         try self.realm.write{ 
          self.realm.delete(self.realm.objects(OverviewItem)) 
          self.realm.add(overviewItemsArray, update: true) 
         } 
        } 
        catch let err as NSError { 
         logger.error("Error with realm: \(err.localizedDescription)") 
        } 
        overviewItemsAsList.removeAll() 
        overviewItemsAsList.appendContentsOf(self.realm.objects(OverviewItem) 
         .sorted("sortOrder", ascending: true)) 
        successHandler(overviewItemsAsList) 
       } 

Возможно, кто-то имеет дополнительный вход, как улучшить это. У меня 10 объектов этого типа. Но на других объектах я получаю 1500 предметов.

ответ

1

Я, наконец, понял, и он работает очень хорошо. Я вычисляю разницу кэшированных данных и новых данных и удаляю их:

private func deleteOrphans(existingData: List<VotingHeader>, fetchedData:[VotingHeader]){ 

     guard existingData.count>0 else { 
      return 
     } 

     let existingIDs = Set(existingData.map({$0.votingID})) 
     let incomingIDs = fetchedData.map({$0.votingID}) 
     let idsToDelete = existingIDs.subtract(incomingIDs) 

     if idsToDelete.count>0{ 
      let itemsToDelete = self.realm.objects(VotingHeader).filter("votingID IN %@",idsToDelete) 

      try! self.realm.write{ 
       self.realm.delete(itemsToDelete) 
      } 
     } 
    } 
0

Вы могли:

-use updated_at поле и обновлять это поле с помощью идентификатора, после чего удалить все объекты, которые не были обновлены или

-удалены все объекты, а затем вставить новые (дорогой, Я бы так не сделал)

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

Другой - это хорошо, если у вас есть небольшое количество данных, и вы уверены, что он будет быстрым и дешевым.

+0

нет решения от одной из фреймворков? Возможно, Objectmapper? – netshark1000

+0

Я не думаю, что есть, но, возможно, кто-то знает лучший способ.аналогичный вопрос может возникнуть при редактировании: с какой стороны вы хотите взять :) Для 1500 записей я бы рекомендовал это обновленное поле в вашем объекте realm. – Miknash

0

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

  • Если у вас есть контроль над API, можно реализовать систему, в которой устройство сообщает серверу метку, когда он последний называется API, и сервер может затем верните список идентификационных номеров в свой ответ для записей, которые были удалены после этого времени.

  • Если вы просто загружаете один и тот же список каждый раз, а не каждый раз удаляете все в файле Realm, выполните ручную петлю через каждую запись в файле Realm и посмотрите, есть ли у нее соответствующая запись в загруженный список. Если нет, удалите его. Конечно, это будет относительно медленная операция, но это будет намного быстрее, чем удалять/воссоздавать все каждый раз.

  • Поскольку, как известно, для кэширования информации о сервере используется Realm, вы можете установить очень строгий срок действия объектов Realm, которые будут удалять их, если они превышены или расширены, если объект обновлен из сервер.

Я надеюсь, что это поможет!

Смежные вопросы