2012-04-14 9 views
3

バックグラウンドスレッドを使用して、日付でソートされたレコードの一部をフェッチしています。IOSコアデータフェッチ要求 - ソート

UIスレッド(テーブルビュー)のレコードを削除するまで、すべてうまく動作します。

//this is done in the background thread 
NSFetchRequest *frequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" 
              inManagedObjectContext:self.managedObjectContext]; 
[frequest setEntity:entity]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
            initWithKey:@"date"  
            ascending:NO]; 

NSArray *descriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[frequest setSortDescriptors:descriptors]; 

[frequest setFetchOffset:fetchOffset];  
[frequest setFetchLimit:20]; 

[frequest setResultType:NSManagedObjectIDResultType]; 

NSError *fetchError; 
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:frequest 
                       error:&fetchError] mutableCopy]; 

バックグラウンドスレッドがNSManagedObjectContextDidSaveNotificationのために登録し、次のセレクタ

//this is done in the background thread 
-(void) didSavePersistenceStore:(NSNotification *)notification 
{ 
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
} 

に問題を行う:レコードを削除した後、後続のフェッチの結果はもう日付でソートされていません。

私には何が欠けていますか?

+0

コードは正しいです。 IMHO、エラーはどこかにあるはずです。 – Mundi

+0

通知はメインスレッド上で行われ、 'mergeChangesFromContextDidSaveNotification:'がメインスレッド上で実行されますが、これは正しいスレッドではありません。これが問題を引き起こしているのかどうかは考えられませんが、微妙なバグが発生する可能性があります。 –

+0

mergeChangesFromContextDidSaveNotificationのターゲットは、バックグラウンドスレッドに関連付けられたManagedObjectContextです。この場合、どのスレッドがメッセージを呼び出すかは重要ですか? – Sammy

答えて

0

まず、間違ったスレッドからmanagedObjectContextを使用しないようにしてください。適切なコンテキストでperformBlockを呼び出すことができます。

第2に、フェッチに使用するフェッチディスクリプタは保持されません。したがって、同じ並べ替え基準でフェッチを続ける場合を除いて、そのようにはなりません。

この動作が必要な場合は、フェッチ結果コントローラを使用します。それはあなたの望む視点をデータベースに維持します。あなたが永続ストアへのすべての変更を書き込むか、NOにincludesPendingChangesを設定する必要が

If you set the value to NSManagedObjectIDResultType, this will demote any sort orderings to “best efforts” hints if you do not include the property values in the request.

:アップルのドキュメントから

関連する問題