У меня есть основной объект данных, который содержит такие поля, как имя (уникальное), imageURL и изображение (сохранение изображения как данных). Я загружаю эти данные из веб-API, которые я не контролирую (данные в JSON).

Я должен каждую неделю проверять, были ли изменения на стороне API, и обновлять мою локальную базу данных. Иногда его свойство imageURL меняется, и я должен это обнаружить, загрузить новое изображение и удалить старый. Любая идея, как это реализовать (я был бы рад за кусок кода).

0
ninja_iOS 19 Сен 2013 в 17:01

1 ответ

Лучший ответ

Я бы подумал, что это довольно просто.

Вы можете загрузить изображения, когда впервые получите товар.

Так что теперь проверьте что-нибудь вроде ...

Если currentImageURL отличается от newImageURL, загрузите изображение.

ИЗМЕНИТЬ - чтобы объяснить, как это должно работать

Предположим, вы обработали JSON и теперь у вас есть NSArray из NSDictionaries ...

Вы бы сделали что-то вроде этого ...

//I'm assuming the object is called "Person"
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];

for (NSDictionary *personDictionary in downloadedArray) {

    // You need to find if there is already a person with that name
    NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name = %@", personDictionary[@"name"]];
    [request setPredicate:namePredicate];

    // use whichever NSManagedObjectContext is correct for your app
    NSArray *results = [self.moc executeFetchRequest:request error:&error];

    Person *person;

    if (results.count == 1) {
        // person already exists so get it.
        person = results[0];
    } else {
        // person doesn't exist, create it and set the name.
        person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.moc];

        person.name = personDictionary[@"name"];
    }

    // check the image URL has changed. If it has then set the new URL and make the image nil.
    if (![personDictionary[@"imageURL"] isEqualToString:person.imageURL]
        || !person.imageURL) {
        person.imageURL = personDictionary[@"imageURL"];
        person.image = nil;
    }

    // now download the image if necessary.
    // I would suggest leaving this here and then wait for the image to be accessed
    // by the UI. If the image is then nil you can start the download of it.

    // now save the context.
}
1
Fogmeister 19 Сен 2013 в 18:31
Поэтому я должен загрузить данные в какие-то временные объекты, затем перебрать их и сравнить с объектами из fetchResult. Если такой же объект существует, проверьте, имеет ли он другой imageUrl, а если не существует, просто добавьте его в MOC? Это не кажется ни элегантным, ни самым быстрым решением ...
 – 
ninja_iOS
19 Сен 2013 в 17:20
Ну, вы говорите, что атрибут name уникален. Как сделать так, чтобы это было уникальным?
 – 
Fogmeister
19 Сен 2013 в 17:26
Знаю, что имя уникальное. Вот как я сейчас это делаю.
 – 
ninja_iOS
19 Сен 2013 в 18:15
Я обновил, чтобы показать, как вы должны обрабатывать каждый элемент. Это можно оптимизировать так, чтобы требовалась только одна выборка, но это дает вам общее представление.
 – 
Fogmeister
19 Сен 2013 в 18:32
Да, по сути, это то, что вы отклонили в первом комментарии. Если у вас есть какой-то волшебный код, который сделает это за вас, я бы хотел его увидеть. ржу не могу
 – 
Fogmeister
19 Сен 2013 в 18:52