3

バックグラウンド スレッドを使用して、日付でソートされた限られた数のレコードを取得しています。

UI スレッド ( tableview ) でレコードを削除するまで、すべてがうまく機能します。

//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];
}

問題: レコードを削除した後、後続のフェッチ結果が日付でソートされなくなります。

何が欠けていますか?

4

2 に答える 2

0

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

次に、フェッチに使用するフェッチ記述子が保持されません。したがって、同じソート基準でフェッチし続けない限り、そのようにはなりません。

その動作が必要な場合は、フェッチ結果コントローラーを使用してください。データベースへの目的のビューが維持されます。

于 2012-04-15T00:00:47.047 に答える
0

Apple のドキュメントから:

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.

すべての変更を永続ストアに書き込むか、includesPendingChanges を NO に設定する必要があります。

于 2014-11-21T11:25:20.290 に答える