2015-06-23 1 views
1

У меня есть приложение restfull, которое загружает содержимое json из веб-службы. При первом вызове веб-службы я кэширую все объекты в основных данных. Проблема возникает при повторном вызове. Мне нужно обновить измененные, удалить те, которые не присутствуют, и вставить все новые. Я получаю все локальные объекты и все полученные, зацикливание для вставки или обновления, а затем удаление тех, которые не были изменены. Проблема в том, что мой алгоритм отстой, и это действительно неэффективно. Какая практика заключается в том, чтобы синхронизировать основные данные с веб-службой?Обновление основных данных из веб-службы. (insert/update/delete)

EDITED:

func updateRestaurantsFromJson(dataArray:[[String: AnyObject]]) { 
    var currentRestaurants = getAllRestaurants() 
    for restaurantDictionary in dataArray { 
     if let restaurant = DBRestaurant.fromJson(restaurantDictionary) { 
      if let index = find(currentRestaurants, restaurant) { 
       currentRestaurants.removeAtIndex(index) 
      } 
     } 
    } 
    removeRestaurants(currentRestaurants) 
} 

Я создаю массив всех текущих объектов, вставка/обновление в DBRestaurant.fromJson и удаление нетронутые них.

class func fromJson(data: [String: AnyObject]) -> DBRestaurant? { 
    if let id = data["id"] as? String { 
     var obj = DBRestaurant.withId(id) 
     var result: DBRestaurant 
     if obj == nil { 
      result = newRestaurant() 
      result.restaurantID = id 
     } else { 
      result = obj! 
     } 
     result.updateWithJson(data) 
     DataManager.save(nil) 
     return result 
    } else { 
     return nil 
    } 
} 

class func withId(id: String) -> DBRestaurant? { 
    let fetchRequest = NSFetchRequest(entityName: kDBRestaurant) 
    fetchRequest.predicate = NSPredicate(format: "restaurantID = %@", id) 
    let restaurant = (self.managedObjectContext.executeFetchRequest(fetchRequest, error: nil) as! [DBRestaurant]).first 
    return restaurant 
} 
+0

Рассматривали ли вы использование сторонней библиотеки, такой как RestKit? – Wain

+0

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

+0

Если вам нужны комментарии к вашему текущему подходу, вам нужно показать код – Wain

ответ

0

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

Затем, если вы запрашиваете свои объекты, вы можете просто сравнить идентификатор извлеченного объекта идентификатора объекта, который вы имеете в CoreData:

if fetchedObject.identifier == coreDataObject.identifier { 
    //you already have the object 
} else { 
    //you don't 
} 

Хотя это звучит просто, во всех проектах я с API REST, эти свойства Identifier работали для меня, и ваш случай выглядит одинаково.

Надеюсь, это поможет

+1

Собственно, это то, что делает функция fromJson. Проблема заключается в том, как распознать объект, который необходимо удалить. –

+0

Вы могли это понять? Я собираюсь сделать что-то подобное, и мне бы хотелось узнать лучшие практики. – ALTVisual

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