2017-01-19 4 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、文字列ではうまくいきません:)解決済み!あなたのお時間をありがとうございました。

関連する問題