I've always wondered if I insert a managed object, then later fetch it repeatedly from the same managed object context, do I get the same object every time? (Assume that there is only one object which matches the given predicate.) This may be important if I want to, say, set an instance variable value.
So I just wrote a little experiment, using an in-memory store, and found that the answer is yes, even if I run a run loop and fetch on a timer. Is this expected, or is this an implementation detail which Apple may change at any time? Thanks, Jerry CONSOLE OUTPUT: Inserted: Foo 0x1e0e960 name=Murphy ivar=Squawk First Fetched: Foo 0x1e0e960 name=Murphy ivar=Squawk Second Fetched: Foo 0x1e0e960 name=Murphy ivar=Squawk Delay Fetched: Foo 0x1e0e960 name=Murphy ivar=Squawk Delay Fetched: Foo 0x1e0e960 name=Murphy ivar=Squawk Delay Fetched: Foo 0x1e0e960 name=Murphy ivar=Squawk ... CODE (A Cocoa Tool Project): #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface Foo : NSManagedObject { NSString* m_ivar ; } @property (copy) NSString* ivar ; @end @implementation Foo @synthesize ivar = m_ivar ; - (void)dealloc { [m_ivar release] ; [super dealloc] ; } - (NSString*)description { return [NSString stringWithFormat: @"Foo %p name=%@ ivar=%@", self, [self valueForKey:@"name"], [self ivar]] ; } @end // Note: This function returns a retained, not autoreleased, instance. NSManagedObjectModel *getStaticManagedObjectModel() { static NSManagedObjectModel *mom = nil; if (mom != nil) { return mom; } mom = [[NSManagedObjectModel alloc] init]; NSEntityDescription *fooEntity = [[NSEntityDescription alloc] init]; [fooEntity setName:@"Foo"]; [fooEntity setManagedObjectClassName:@"Foo"]; [mom setEntities:[NSArray arrayWithObject:fooEntity]]; NSMutableArray* properties = [[NSMutableArray alloc] init] ; NSAttributeDescription *attributeDescription; // Add an attribute. (Copy this section to add more attributes.) attributeDescription = [[NSAttributeDescription alloc] init]; [attributeDescription setName:@"name"]; [attributeDescription setAttributeType:NSStringAttributeType]; [attributeDescription setOptional:YES]; [properties addObject:attributeDescription] ; [attributeDescription release] ; [fooEntity setProperties:properties]; [properties release] ; [fooEntity release] ; return mom; } // Note: This function returns a retained, not autoreleased, instance. NSManagedObjectContext *getStaticManagedObjectContext() { static NSManagedObjectContext *moc = nil; if (moc != nil) { return moc; } moc = [[NSManagedObjectContext alloc] init]; NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:getStaticManagedObjectModel()]; [moc setPersistentStoreCoordinator: coordinator]; [coordinator release] ; NSError *error; NSPersistentStore *newStore ; newStore = [coordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error]; if (newStore == nil) { NSLog(@"Store Configuration Failure\n%@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error"); } return moc; } @interface DelayedFetcher : NSObject { } @end @implementation DelayedFetcher + (void)fetchFoo:(NSTimer*)timer { NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; NSManagedObjectContext *moc = getStaticManagedObjectContext() ; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Foo" inManagedObjectContext:moc]]; NSArray* fetches = [moc executeFetchRequest:fetchRequest error:NULL] ; [fetchRequest release] ; Foo* delayFetchedFoo = [fetches objectAtIndex:0] ; NSLog(@" Delay Fetched: %@", delayFetchedFoo) ; } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // Create Core Data stack NSManagedObjectModel *mom = getStaticManagedObjectModel(); NSManagedObjectContext *moc = getStaticManagedObjectContext(); // Insert a Foo and name it "Murphy" Foo* insertedFoo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo" inManagedObjectContext:moc] ; [insertedFoo setValue:@"Murphy" forKey:@"name"] ; [insertedFoo setIvar:@"Squawk"] ; [moc processPendingChanges] ; [moc save:NULL] ; NSFetchRequest* fetchRequest ; NSArray* fetches ; // Fetch the Foo fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Foo" inManagedObjectContext:moc]]; fetches = [moc executeFetchRequest:fetchRequest error:NULL] ; [fetchRequest release] ; Foo* firstFetchedFoo = [fetches objectAtIndex:0] ; // Fetch the Foo again fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"Foo" inManagedObjectContext:moc]]; fetches = [moc executeFetchRequest:fetchRequest error:NULL] ; [fetchRequest release] ; Foo* secondFetchedFoo = [fetches objectAtIndex:0] ; // See what we got NSLog(@" Inserted: %@", insertedFoo) ; NSLog(@" First Fetched: %@", firstFetchedFoo) ; NSLog(@"Second Fetched: %@", secondFetchedFoo) ; // Fetch again and again NSRunLoop* runLoop = [NSRunLoop currentRunLoop] ; [NSTimer scheduledTimerWithTimeInterval:1.0 target:[DelayedFetcher class] selector:@selector(fetchFoo:) userInfo:nil repeats:YES] ; [runLoop run] ; [moc release] ; [mom release] ; [pool release] ; return 0; }_______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com