2010-09-21 40 views
8

Tôi xem hướng dẫn về Dữ liệu cốt lõi và có hai cách để có được một phiên bản NSManagedObject mới.Giới thiệu về việc nhận đối tượng NSManagedObject mới

  • - initWithEntity: insertIntoManagedObjectContext: của lớp NSManagedObject
  • + insertnewObjectForEntityForName: inManagedObjectContext: của lớp NSEntityDescription

Có bất kỳ sự khác biệt giữa hai phương pháp? Hoặc, họ chỉ có nghĩa là cùng một điều để có được một NSManagedObject mới trong bất kỳ điều kiện.

Trả lời

7

Dựa trên nội dung được nói trên tài liệu, bằng cách sử dụng phương thức lớp từ NSEntityDescription để khởi tạo NSManagedObject có thể thực hiện mà không cần khai báo/nhập tiêu đề của nó. Bằng cách thiết lập tên của lớp, bạn sẽ lấy lại một "cá thể được cấu hình đầy đủ" của đối tượng.

Rất hữu ích trong các giai đoạn phát triển khi mọi thứ đang thay đổi liên tục nhưng nó có thể là yếu tố nguy cơ vì bạn không nhận được bất kỳ lỗi biên dịch hoặc cảnh báo nào nếu bạn viết sai tên của lớp học vì đó là chuỗi.

Phương thức từ NSManagedObject cần giao diện của lớp cụ thể được nhập vào tệp của bạn và làm cho nó mạnh hơn chống lại lỗi, vì trình biên dịch có thể kiểm tra xem lớp đó có tồn tại hay không.

Ví dụ, chúng sẽ có cùng kết quả, chúng sẽ trả về một thể hiện của lớp được chỉ định. Mặc dù giữ lại đếm sẽ khác nhau:

- initWithEntity:insertIntoManagedObjectContext: (giữ lại count == +1)

+ insertnewObjectForEntityForName:inManagedObjectContext: (giữ lại count == 0)

Ở đây nó là tài liệu

NSEntityDescription Class Reference (insertNewObjectForEntityForName:inManagedObjectContext:)

Giá trị trả lại

Ví dụ mới, được tự động hoàn thành, được cấu hình đầy đủ của lớp cho thực thể có tên entityName. Ví dụ có bộ mô tả thực thể của nó và được chèn nó vào ngữ cảnh.

Thảo luận

Phương pháp này làm cho nó dễ dàng cho bạn để tạo ra các trường hợp của một thực thể được mà không lo lắng về các chi tiết của sự sáng tạo đối tượng quản lý.

Phương pháp này đặc biệt hữu ích trên Mac OS X v10.4, vì bạn có thể sử dụng phương pháp này để tạo đối tượng được quản lý mới mà không phải biết lớp được sử dụng để biểu diễn thực thể. Điều này đặc biệt có lợi sớm trong vòng đời phát triển khi các lớp và tên lớp biến động.

Trên Mac OS X v10.5 trở lên và trên iOS, thay vào đó bạn có thể sử dụng initWithEntity: insertIntoManagedObjectContext: trả về một thể hiện của lớp thích hợp cho thực thể.

NSManagedObject Class Reference (initWithEntity:insertIntoManagedObjectContext:)

Return Value

Một khởi tạo thể hiện của lớp phù hợp với thực thể.

Thảo luận

NSManagedObject sử dụng thế hệ lớp năng động để hỗ trợ các Objective-C 2 thuộc tính đặc trưng (xem “Properties khai báo”) bằng cách tự động tạo ra một lớp con của lớp thích hợp cho entity.initWithEntity: insertIntoManagedObjectContext: do đó lợi nhuận một thể hiện của lớp thích hợp cho thực thể. Lớp con được tạo động sẽ dựa trên lớp được chỉ định bởi thực thể, do đó việc chỉ định một lớp tùy chỉnh trong mô hình của bạn sẽ thay thế lớp được chuyển sang cấp phát.

Nếu ngữ cảnh không phải là nil, phương thức này sẽ gọi [context insertObject: self] (làm cho awakeFromInsert được gọi).

Bạn không được khuyến khích ghi đè phương pháp này — thay vào đó bạn nên ghi đè awakeFromInsert và/hoặc awakeFromFetch (nếu có logic chung với các phương pháp này, nên được tính vào phương thức thứ ba được gọi từ cả hai). Nếu bạn thực hiện khởi tạo tùy chỉnh trong phương pháp này, bạn có thể gây ra vấn đề với hoàn tác và làm lại các thao tác.

Trong nhiều ứng dụng, không cần phải gán một đối tượng được quản lý mới được tạo cho một cửa hàng cụ thể — xem assignObject: toPersistentStore :. Nếu ứng dụng của bạn có nhiều cửa hàng và bạn cần gán một đối tượng cho một cửa hàng cụ thể, bạn không nên làm như vậy trong phương thức khởi tạo của đối tượng được quản lý. Phép gán như vậy không phải là logic ở mức mô-đun điều khiển.

+0

Cảm ơn bạn rất nhiều. – AechoLiu

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