2017-01-19 1 views
0

자, 여기 제 문제입니다. REST-api를 통해 서버의 데이터를 동기화하고 있습니다. 반환 된 데이터는 JSON에 있으며, 루프를 통해 반복되며 데이터에 따라 적절한 조치를 취합니다. 즉, 새 객체로 저장하거나 이미 존재하는 객체를 업데이트하거나 로컬에만 존재하는 경우 객체를 삭제합니다."NOT IN"상태의 NSPredicate가 실패합니다.

이렇게하려면 JSON을 반복 할 때 반환 된 개체에서 ID를 수집합니다. 이것은 나에게 반환 된 모든 객체의 인덱스를 제공합니다. 그런 다음 로컬에 저장된 데이터를 쿼리하여 삭제해야하는 개체가 있는지 확인합니다 (즉, 로컬 ID가 존재하거나 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를 사용하고 있습니다.

나는 다음에 시도 할 물건이 완전히 없어 졌기 때문에 어떤 도움을 주시면 감사하겠습니다! :)

+0

'arrayOfLogIDS' 배열에 데이터를 채우는 위치를 알려주시겠습니까? – CodeChanger

+0

질문을 편집했습니다. 검토해 주셔서 감사합니다! :) – cmeriksson

+0

NOT IN을 올바르게 사용하는 것이 좋습니다. 어쩌면 문제는 다른 곳에서도있을 수 있습니다. – danh

답변

0

자, ID 배열에는 때로는 문자열로, 때로는 정수로 저장된 값이 있습니다. 정수는 NSPredicate 문자열과 잘 맞지 않습니다. :) 해결되었습니다! 시간 내 주셔서 감사합니다.

관련 문제