2015-07-11 15 views
29

Tôi đã gặp phải từ khóa này trong những dịp khác nhau. Tôi biết những gì nó giả sử để làm. Nhưng tôi thực sự muốn hiểu rõ hơn về nó.@NSManaged làm gì?

Những gì tôi nhận thấy về @NSManaged - không dựa trên tài liệu, nhưng thông qua sử dụng lặp đi lặp lại:

  1. Nó kỳ diệu thay thế mã hóa giá trị then chốt.
  2. Nó tương đương với @dynamic trong Objective-C (mà tôi không biết nhiều về)
  3. tôi cần nó để phân lớp PFObject từ Parse SDK. Nó thường sử dụng KVC để đọc/ghi các giá trị từ/đến backend.
  4. Tiền tố bất kỳ biến nào với @NSManaged sẽ đóng trình biên dịch khi tôi không khởi tạo trong trình khởi tạo.

Định nghĩa chính thức (trong Core dữ liệu của Apple Documents):

Core Data cung cấp lưu trữ cơ bản và thực hiện các thuộc tính trong lớp con của lớp NSManagedObject. Thêm thuộc tính @NSManaged trước mỗi định nghĩa thuộc tính trong lớp con đối tượng được quản lý của bạn tương ứng với một thuộc tính hoặc mối quan hệ trong mô hình Dữ liệu cốt lõi của bạn. Giống như thuộc tính @dynamic trong Objective-C, thuộc tính @NSManaged thông báo cho trình biên dịch Swift rằng việc lưu trữ và thực hiện một thuộc tính sẽ được cung cấp khi chạy. Tuy nhiên, không giống như @dynamic, thuộc tính @NSManaged chỉ có sẵn để hỗ trợ Core Data.

gì tôi nhận được từ đó:

biến với @NSManaged được miễn kiểm tra thời gian biên dịch cho một cái gì đó .

Tôi đã đọc các tài liệu chính thức và nhiều SO câu hỏi khác liên quan đến vấn đề này:

@synthesize vs @dynamic, what are the differences?

What is common case for @dynamic usage?

tôi theo bản năng nhận một số kịch bản mà tôi nên sử dụng nó. Tôi một phần biết những gì nó làm. Nhưng điều tôi tìm kiếm là hiểu rõ hơn về những gì nó làm.

Quan sát thêm:

Một PFObject trong Parse SDK dựa vào Key Value Coding để truy cập giá trị của nó.Các PFObject cung cấp accessors sau:

objectForKey:

let score = results.objectForKey("descriptionOfResult") 
//returns the descriptionOfResult value from the results object 

setObject:forKey:

results.setObject("The results for a physics exam", forKey: "descriptionOfResult") 
//sets the value of descriptionOfResult 

Để hiểu biết của tôi, @NSManagedkỳ diệu hiểu rằng biến Tôi đã tuyên bố tự động sử dụng bộ truy xuất trên để getset. Tôi muốn biết nó như thế nào (nếu những gì tôi hiểu là đúng), và bất cứ điều gì khác nó làm.

+0

Bạn đã bao giờ tìm hiểu xem hành vi bạn đã quan sát (trong Quan sát thêm) đã đạt được như thế nào? @NSManaged sử dụng các trình tiếp cận chính xác như thế nào? – Jason

+0

thuộc tính @NSManaged chỉ khả dụng cho hỗ trợ Dữ liệu cốt lõi không hoàn toàn đúng. Bạn cũng cần phải sử dụng nó cho các biến nhanh CoreAnimation mà bạn muốn tạo hiệu ứng trên: http://stackoverflow.com/questions/24150243/are-needsdisplayforkey-actionforkey-overrides-working-correctly – ambientlight

Trả lời

28

Có, nó thực sự hoạt động như @dynamic - về mặt kỹ thuật, nó có thể giống hệt nhau. Về mặt ngữ nghĩa, có một sự khác biệt nhỏ:

@dynamic nói 'trình biên dịch, không kiểm tra xem các thuộc tính của tôi cũng được triển khai hay chưa. Có thể không có mã nào bạn có thể thấy nhưng tôi đảm bảo rằng mã này sẽ hoạt động khi chạy '

@NSQuản lý bây giờ nói' trình biên dịch, không kiểm tra các thuộc tính đó vì tôi có Dữ liệu cốt lõi để quản lý việc triển khai - nó sẽ có khi chạy'

vì vậy bạn có thể thậm chí nói: @NSManaged là cú pháp đường đó là một phiên bản hẹp hơn của động :)


https://github.com/KyoheiG3/DynamicBlurView/issues/2
đây có người thậm chí còn sử dụng @NSManaged mà không cần đĩa CD vì ông muốn @dynamic behavior

+0

Tôi muốn đi sâu hơn một chút vào vấn đề - Làm thế nào để trình biên dịch thường biết cách thực thi thuộc tính và cách '@ NSManaged' làm cho trình biên dịch trì hoãn trách nhiệm này ở nơi khác? Nó có tương tự như lệnh 'super' khi ghi đè phương thức không? Là '@ NSManaged' nói với trình biên dịch:" Lấy các chi tiết thực hiện từ lớp cha "? –

+0

bình thường, khi biên dịch mã máy cho phương thức (hoặc thuộc tính) phải có - đó là những gì trình biên dịch kiểm tra. NHƯNG thời gian chạy objC/swift hỗ trợ thêm mã máy tại thời gian chạy ... sau đó ai đó phải thêm mã chỉ trong thời gian :) với NSManaged, coreData làm điều đó cho bạn.Mã KHÔNG ở trong siêu lớp nhưng được tạo ra trên bay –

+0

@KelvinLau bạn vẫn còn câu hỏi ở đây? –

1

Trong apple docs, cho Custom Managed Object Class, họ trích dẫn thuộc tính ví dụ như ... enter image description here Đối với tôi có vẻ như không có sự khác biệt, tôi đã sử dụng @dynamic trong C khách quan, có vẻ như @NSManaged là sự thay thế trong Swift.

0

Câu trả lời được đề cập ở trên là đúng. Đây là sự hiểu biết của tôi.

@NSQuản lý cho biết rằng các biến sẽ nhận được một số giá trị khi chúng tôi chạy ứng dụng. Coredata tự động tạo ra getter và setter cho các đạo cụ như vậy. Nó im lặng trình biên dịch cho cảnh báo.

NSmanaged là phân lớp của NSObject. @NSQuản lý nghĩa là mã bổ sung sẽ được cung cấp cho các đạo cụ này khi chạy. Nó theo dõi các thay đổi được thực hiện cho các thuộc tính đó.