2010-01-25 17 views
7

Từ một ví dụ của Apple, tôi có điều này:Tôi có thể tạo một phiên bản mới của lớp đối tượng được quản lý tùy chỉnh của mình mà không phải trải qua NSEntityDescription không?

Event *event = (Event*)[NSEntityDescription 
    insertNewObjectForEntityForName:@"Event" 
      inManagedObjectContext:self.managedObjectContext]; 

Event thừa hưởng từ NSManagedObject. Có cách nào để tránh cuộc gọi lạ này tới NSEntityDescription và thay vào đó chỉ cần alloc+init bằng cách nào đó trực tiếp lớp Event? Tôi có phải viết bộ khởi tạo của riêng mình mà chỉ làm những thứ đó ở trên không? Hoặc là NSManagedObject đã đủ thông minh để làm điều đó chưa?

Trả lời

5

NSManagedObject cung cấp phương thức được gọi là initWithEntity:insertIntoManagedObjectContext:. Bạn có thể sử dụng điều này để thực hiện một cặp alloc/init truyền thống hơn. Lưu ý rằng đối tượng trả về này là không phải là được tự động phát hành.

+0

Oh yeah, nhưng đừng bao giờ ghi đè 'initWithEntity: insertIntoManagedObjectContext:'. 'awakeFromInsert' là nơi thích hợp để khởi tạo. – Alex

1

Để làm cho nó hoạt động đúng, có rất nhiều thứ cần làm. -insertNewObject: ... là cách dễ nhất, lạ hay không. The documentation nói:

Một đối tượng quản lý khác với các đối tượng khác theo ba cách-một chính quản lý đối tượng ... Tồn tại trong một môi trường định nghĩa bởi nó được quản lý bối cảnh đối tượng ... có do đó là rất nhiều làm việc làm để tạo ra một đối tượng quản lý mới và đúng cách tích hợp nó vào cơ sở hạ tầng dữ liệu lõi ... bạn đang nản từ trọng initWithEntity: insertIntoManagedObjectContext:

Điều đó nói rằng, bạn vẫn có thể làm điều đó (đọc thêm trang xuống mà tôi liên kết) nhưng mục tiêu của bạn dường như là "dễ dàng hơn" hoặc "ít lạ". Tôi muốn nói rằng phương pháp bạn cảm thấy là kỳ lạ thực sự là cách đơn giản nhất, bình thường nhất.

1

Tôi đã tìm thấy câu trả lời dứt khoát từ Phát triển iPhone 3 khác bởi Dave Mark và Jeff LeMarche.

Nếu nó thực sự làm phiền bạn mà bạn sử dụng một phương pháp trên NSEntityDescrpiton hơn là trên NSManagedObjectContext để chèn một đối tượng mới vào một NSManagedObjectContext, bạn có thể sử dụng một loại để thêm một phương pháp dụ để NSManagedObjectContext.

Tạo hai tệp văn bản mới có tên NSManagedObject-Insert.hNSManagedObject-Insert.m.

Trong NSManagedObject-Insert.h, đặt đoạn mã sau:

import <Cocoa/Cocoa.h> 
@interface NSManagedObjectContext (insert) 
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name; 
@end 

Trong NSManagedObject-Insert.m, đặt mã này:

#import "NSManagedObjectContext-insert.h" 

@implementation NSManagedObjectContext (insert) 
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name 
{ 
return [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:self]; 
} 
@end 

Bạn có thể nhập NSManagedObject -Insert.h ở bất kỳ nơi nào bạn muốn sử dụng phương pháp mới này.Sau đó thay thế các cuộc gọi chèn chống NSEntityDescription, như thế này:

NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; 

với ngắn hơn và trực quan hơn một:

[context insertNewEntityWithName:[entity name]]; 

Không phải loại lớn?

3

Tôi đã gặp sự cố tương tự. Hóa ra bạn hoàn toàn có thể tạo ra một thực thể và không thêm nó vào cửa hàng lúc đầu, sau đó thực hiện một số kiểm tra trên đó và nếu mọi thứ đều được chèn vào cửa hàng. Tôi sử dụng nó trong một phiên phân tích cú pháp XML, trong đó tôi chỉ muốn chèn các thực thể khi chúng đã được phân tích chính xác và hoàn toàn.

Trước tiên, bạn cần phải tạo ra các thực thể:

// This line creates the proper description using the managed context and entity name. 
// Note that it uses the managed object context 
NSEntityDescription *ent = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:[self managedContext]]; 

// This line initialized the entity but does not insert it into the managed object context.  
currentEntity = [[Location alloc] initWithEntity:ent insertIntoManagedObjectContext:nil]; 

Sau đó, một khi bạn đang hài lòng với quá trình xử lý, bạn có thể dễ dàng chèn thực thể của bạn vào cửa hàng:

[self managedContext] insertObject:currentEntity 

Lưu ý rằng trong những ví dụ các đối tượng currentEntity đã được xác định trong tệp tiêu đề như sau:

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