2011-10-31 7 views
0

私のアプリケーションはコアデータを使用し、属性は 'beenSeen'と呼ばれます。ユーザーがアプリをリフレッシュすると、1の「beenSeen」の値はすべて0に変更されます.2000以上のオブジェクトを持つiPod Touchの第2世代では、リフレッシュに1分以上かかります。私のコードは次のようになります:コアデータエンティティの属性を効率的にリセットする方法

for (Deck *deck in self.deckArray) { 
     if ([deck.beenSeen isEqualToNumber:[NSNumber numberWithInt:1]]) { 
      [deck setBeenSeen:[NSNumber numberWithInt:0]]; 
      [self.managedObjectContext save:&error];   
     } 
    } 

また、sqliteファイルを削除して、ユーザーにアプリケーションを再起動するよう警告することも考えています。確かにこれは、私が今持っているものよりずっと速いです。エンティティをすばやく更新する方法はありますか?私は 'バックアップ'エンティティを持ってそれをコピーすることができますか?助けてくれてありがとう。

答えて

1

hm。私がお勧めしたい最初の最適化は

for (Deck *deck in self.deckArray) { 
    if ([deck.beenSeen isEqualToNumber:[NSNumber numberWithInt:1]]) { 
     [deck setBeenSeen:[NSNumber numberWithInt:0]]; 
    } 
} 
[self.managedObjectContext save:&error];   

私が代わりに2000人の小さなもので、それは一つの大きなコンテキストが保存を行うに物事をスピードアップするかもしれない疑いがあるだろう。

beenSeenの値の大部分が1から0に変化し、他の値がすでに0である場合は、ifテストを取り除くことをお勧めします。 0を指定して、それぞれを個別にチェックする時間を節約できます。 (そこ万個のオブジェクトがあり、あなたがそれらの2,000をリセットしている一方、その後の試験を取り払う最適ではないかもしれません。)

for (Deck *deck in self.deckArray) { 
    [deck setBeenSeen:[NSNumber numberWithInt:0]]; 
    } 
    [self.managedObjectContext save:&error];   
} 

第三の提案は、この別の実施について考えることであろうあなたのデッキオブジェクトはlastSeen属性を実装し、デッキが最後に見られた日時を格納してから、一括リセット(そして2000コアデータ行の書き込み)の代わりに、各デッキのlastSeen日付最後のユーザーリフレッシュのタイムスタンプとの時間。

+0

あなたはまだsavを持っていますeをループの内側に配置します。あなたはそれを後に置くことを意味すると思います。 –

+0

固定 - 私の悪い。 –

+0

簡単に変更していただきありがとうございます。時間は55秒から6に落ちました! – shohaku

1

述語を使用してアレイをフィルタリング、まず、これを試してみてください。最後にコンテキストを保存

[filtered setValue:[NSNumber numberWithInt:0] forKeyPath:@"beenSeen"]; 

[self.managedObjectContext save:&error]; 

・ホープ、この

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"beenSeen == %@", 
          [NSNumber numberWithInt:1]]; 

NSArray* filtered = [self.deckArray filteredArrayUsingPredicate:predicate]; 

今すぐ新しい値を設定助けてください:)

+0

ありがとう、これは素晴らしい!しかし、私はもう1秒ほど速かったので、もう一方のものと一緒に行くつもりです。 ;-) – shohaku

+0

確かに、歓声!あなたは試しました[self.deckArray setValue:[NSNumber numberWithInt:0] forKeyPath:@ "beenSeen"]; ?? – D33pN16h7

+0

Ha、それは5.741秒でさらに高速です。ありがとう! 最初のソリューションは5.902秒でした。 スコットの解答は5.785秒であった。 – shohaku

関連する問題