2009-09-28 31 views
8

Có cách nào để khởi tạo đối tượng được quản lý bên ngoài ngữ cảnh hay không. Về cơ bản, tôi cố gắng phân bổ/init một đối tượng Managed bên ngoài ngữ cảnh trước, sau đó tìm ra nếu tôi thực sự muốn chèn đối tượng, và sau đó tiêm nó vào kho dữ liệu bằng cách sử dụng ngữ cảnh đối tượng được quản lý hiện có.Dữ liệu lõi iPhone: Khởi tạo đối tượng được quản lý mà không có ngữ cảnh

Điều này có thể thực hiện được hay không đi ngược lại mục đích sử dụng dự định của Dữ liệu chính?

Trả lời

5

Đối tượng được quản lý được "quản lý" theo ngữ cảnh, do đó bạn không thể thực sự instanciate chúng với phân bổ vì họ không có nghĩa là. Tuy nhiên, instantiating một đối tượng quản lý thông qua ngữ cảnh không tồn tại nó cho đến khi bạn gọi lưu phương pháp trên bối cảnh, vì vậy bạn sẽ có tác dụng tương tự bằng cách sử dụng bối cảnh để instanciate nó và chỉ tiết kiệm sau khi bạn tìm ra rằng bạn thực sự muốn sử dụng các đối tượng.

+0

I figured càng nhiều, chỉ muốn khẳng định rằng đây là trường hợp. Cảm ơn Daniel. – WillF

2

Không, bạn không thể khởi tạo NSManagedObject instsance bên ngoài NSManagedObjectContext (tốt, bạn có thể, nhưng những điều xấu sẽ xảy ra và chương trình của bạn gần như chắc chắn sẽ không hoạt động như bạn mong muốn). Tuy nhiên, bạn có thể tạo một NSInMemoryPersistentStore -backed NSManagedObjectContext. Đó là thiết lập nhiều hơn một chút (không nhiều) và tất cả mọi thứ biến mất khi bạn dealloc cửa hàng trong bộ nhớ. Trong thời gian đó, bạn sẽ có được tất cả các lợi ích của việc quản lý đồ thị đối tượng của Core Data.

0

Điều bạn có thể quay là nhiều bối cảnh. Bạn có thể tạo thêm ngữ cảnh "scratchpad" và sau đó hợp nhất bất kỳ thay đổi nào trở lại ngữ cảnh chính. Một trong những dự án mẫu iPhone của Apple hoàn thành chính xác điều này. Bạn sẽ phải đăng nhập vào trung tâm dev để tìm nó.

1

Đối với bất cứ ai tình cờ gặp câu hỏi này, dưới đây là cách tôi đã làm xong những gì OP có lẽ sẽ cho:

NSManagedObjectContext *moc = AppDelegate.managedObjectContext; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyModel" 
    inManagedObjectContext:moc]; 
MyModel *model = [[MyModel alloc] initWithEntity:entity 
    insertIntoManagedObjectContext:nil]; 
+1

Tôi sẽ cảnh giác với việc sử dụng điều này nếu các MOC được tạo ra bằng cách sử dụng bất kỳ thứ gì, nhưng NSConfinementConcurrencyType mặc định - NSPrivateQueueConcurrencyType hoặc NSMainQueueConcurrencyType có thể dẫn đến các vấn đề với các thuộc tính nhận được – stevesliva

+0

Ngoài ra, 'awakeFromInsert' không được gọi! – stevesliva

+0

'' 'awakeFromInsert''' sẽ được gọi nếu bạn sau đó thêm nó vào MOC thông qua' '' [moc insertObject: model]; '' ' – etipton

Các vấn đề liên quan