mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-04-29 21:25:51 +08:00
Adjust search indexing to use a new indexingContext
This commit is contained in:
@@ -155,6 +155,40 @@
|
||||
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
|
||||
}
|
||||
|
||||
- (void)testIndexingManagedObjectUsingIndexingContext
|
||||
{
|
||||
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
|
||||
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"RKHuman"];
|
||||
[RKSearchIndexer addSearchIndexingToEntity:entity onAttributes:@[ @"name", @"nickName" ]];
|
||||
|
||||
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
|
||||
NSError *error;
|
||||
[persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
|
||||
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
|
||||
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator;
|
||||
|
||||
NSManagedObjectContext *indexingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||
[indexingContext setPersistentStoreCoordinator:persistentStoreCoordinator];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:indexingContext queue:nil usingBlock:^(NSNotification *notification) {
|
||||
[managedObjectContext performBlock:^{
|
||||
[managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
|
||||
}];
|
||||
}];
|
||||
|
||||
RKSearchIndexer *indexer = [RKSearchIndexer new];
|
||||
indexer.stopWords = [NSSet setWithObject:@"is"];
|
||||
indexer.indexingContext = indexingContext;
|
||||
NSManagedObject *human = [NSEntityDescription insertNewObjectForEntityForName:@"RKHuman" inManagedObjectContext:managedObjectContext];
|
||||
[human setValue:@"This is my name" forKey:@"name"];
|
||||
|
||||
NSUInteger count = [indexer indexManagedObject:human];
|
||||
assertThatInteger(count, is(equalToInteger(3)));
|
||||
NSSet *searchWords = [human valueForKey:RKSearchWordsRelationshipName];
|
||||
|
||||
assertThat([searchWords valueForKey:@"word"],
|
||||
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
|
||||
}
|
||||
|
||||
- (void)testIndexingOnManagedObjectContextSave
|
||||
{
|
||||
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
|
||||
@@ -183,6 +217,51 @@
|
||||
[indexer stopObservingManagedObjectContext:managedObjectContext];
|
||||
}
|
||||
|
||||
- (void)testIndexingOnManagedObjectContextSaveUsingIndexingContext
|
||||
{
|
||||
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
|
||||
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"RKHuman"];
|
||||
[RKSearchIndexer addSearchIndexingToEntity:entity onAttributes:@[ @"name", @"nickName" ]];
|
||||
|
||||
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
|
||||
NSError *error;
|
||||
[persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
|
||||
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
|
||||
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator;
|
||||
|
||||
NSManagedObjectContext *indexingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||
[indexingContext setPersistentStoreCoordinator:persistentStoreCoordinator];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:indexingContext queue:nil usingBlock:^(NSNotification *notification) {
|
||||
[managedObjectContext performBlock:^{
|
||||
[managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
|
||||
}];
|
||||
}];
|
||||
|
||||
RKSearchIndexer *indexer = [RKSearchIndexer new];
|
||||
indexer.stopWords = [NSSet setWithObject:@"is"];
|
||||
indexer.indexingContext = indexingContext;
|
||||
NSManagedObject *human = [NSEntityDescription insertNewObjectForEntityForName:@"RKHuman" inManagedObjectContext:managedObjectContext];
|
||||
[human setValue:@"This is my name" forKey:@"name"];
|
||||
|
||||
// Index on save
|
||||
[indexer startObservingManagedObjectContext:managedObjectContext];
|
||||
[managedObjectContext save:&error];
|
||||
|
||||
// Spin the run loop to allow the did save notifications to propogate
|
||||
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
|
||||
|
||||
[managedObjectContext refreshObject:human mergeChanges:YES];
|
||||
NSManagedObjectID *objectID = [human objectID];
|
||||
[managedObjectContext reset];
|
||||
human = [managedObjectContext existingObjectWithID:objectID error:nil];
|
||||
|
||||
NSSet *searchWords = [human valueForKey:RKSearchWordsRelationshipName];
|
||||
assertThat([searchWords valueForKey:@"word"],
|
||||
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
|
||||
|
||||
[indexer stopObservingManagedObjectContext:managedObjectContext];
|
||||
}
|
||||
|
||||
- (void)testIndexingChangesInManagedObjectContextWithoutSave
|
||||
{
|
||||
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
|
||||
@@ -209,4 +288,39 @@
|
||||
|
||||
}
|
||||
|
||||
- (void)testIndexingChangesInManagedObjectContextWithoutSaveUsingIndexingContext
|
||||
{
|
||||
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
|
||||
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"RKHuman"];
|
||||
[RKSearchIndexer addSearchIndexingToEntity:entity onAttributes:@[ @"name", @"nickName" ]];
|
||||
|
||||
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
|
||||
NSError *error;
|
||||
[persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
|
||||
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
|
||||
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator;
|
||||
|
||||
NSManagedObjectContext *indexingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||
[indexingContext setPersistentStoreCoordinator:persistentStoreCoordinator];
|
||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:indexingContext queue:nil usingBlock:^(NSNotification *notification) {
|
||||
[managedObjectContext performBlock:^{
|
||||
[managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
|
||||
}];
|
||||
}];
|
||||
|
||||
RKSearchIndexer *indexer = [RKSearchIndexer new];
|
||||
indexer.stopWords = [NSSet setWithObject:@"is"];
|
||||
indexer.indexingContext = indexingContext;
|
||||
NSManagedObject *human = [NSEntityDescription insertNewObjectForEntityForName:@"RKHuman" inManagedObjectContext:managedObjectContext];
|
||||
[human setValue:@"This is my name" forKey:@"name"];
|
||||
|
||||
// Index the current changes
|
||||
[indexer indexChangedObjectsInManagedObjectContext:managedObjectContext];
|
||||
|
||||
NSSet *searchWords = [human valueForKey:RKSearchWordsRelationshipName];
|
||||
assertThat([searchWords valueForKey:@"word"],
|
||||
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
Reference in New Issue
Block a user