Хорошо, вот моя проблема. Я синхронизирую данные с сервера через REST-api. Возвращенные данные находятся в JSON, я прохожу через него и принимает соответствующие действия в зависимости от данных. То есть я либо храню его как новый объект, либо обновляет объект, если он уже существует, либо удаляет его, если он существует только локально.NSPredicate с условием «NOT IN» не работает
Для этого я собираю идентификаторы из возвращаемых объектов, когда я прохожу через JSON. Это дает мне индекс всех возвращаемых объектов. Затем я запрашиваю локально сохраненные данные, чтобы увидеть, содержит ли он какие-либо объекты, которые необходимо удалить (другими словами, если локальный идентификатор существует или нет в ответе JSON).
И вот мой вопрос (извините за несколько длинный пролог); NSPredicate, который я использую только для определенных сценариев, и которые работают или не работают, кажется случайным.
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
// Array which populates with the IDs from the server
NSMutableArray *arrayOfLogIDS = [[NSMutableArray alloc] init];
/*
Fetching and parsing JSON ... collecting IDs and adding them to the array. See example below;
*/
NSArray *logs = [[json valueForKey:@"Logs"] valueForKey:@"Object"];
// Looping through the logs array
for (NSArray *log in logs) {
[arrayOfLogIDS addObject:[log valueForKey:@"serverID"]];
}
// The NSPredicate
NSPredicate *serverIDS = [NSPredicate predicateWithFormat:@"NOT (serverID IN %@)", arrayOfLogIDS];
// The array which holds the objects that should be deleted
NSArray *logs = [Logs MR_findAllWithPredicate:serverIDS inContext:localContext];
}];
Проблема в том, что NSPredicate не будет работать для этого конкретного обстоятельства. Он не возвращает никаких результатов, хотя я знаю, что у меня есть локальные объекты, которые нужно удалить. Я использую этот подход в других местах приложения, и он работает так, как ожидалось. Как вы можете видеть, я использую Magical Record для управления основными данными в этом приложении.
Я чувствую, что я полностью исчерпал все, чтобы попробовать дальше, поэтому любая помощь будет очень признательна! :)
Можете ли вы рассказать мне, где вы заполняете данные в массив 'arrayOfLogIDS'? – CodeChanger
Я отредактировал вопрос, спасибо, что посмотрел на него! :) – cmeriksson
Ваше использование NOT IN выглядит правильно. Может быть, проблема в другом месте. – danh