2013-04-06 13 views
18

Sử dụng CoreData Tôi đã tạo một thực thể, sau đó tôi đã phân loại nó thành tệp riêng của nó, nơi nó có @propertys, sau đó nó có phần @dynamic trong tệp .m.Với CoreData, nếu tôi có thuộc tính @dynamic, tôi có thể ghi đè lên getter của nó giống như nó đã được @synthesized không? (Lazy Instantiation)

Khi tôi muốn một cái gì đó để có một giá trị nhất định nếu nó không bao giờ được thiết lập, tôi luôn luôn sử dụng instantiation lười biếng, như sau:

- (NSString *)preview { 
    if ([self.body length] < 200) { 
     _preview = self.body; 
    } 
    else { 
     _preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
    } 

    return _preview; 
} 

Nhưng làm thế nào để tôi làm điều này với tính @dynamic? Nếu tôi làm điều tương tự, nó nói _preview là một tài sản không khai báo, nhưng nó nằm trong tệp .h. Tôi phải làm gì khác để tạo ra nó?

+1

Nó nói '_preview' là một _indentifier_ không khai báo, bởi vì bạn không có một biến với tên đó. '@ synthesize' tạo biến; '@ dynamic' thì không. –

Trả lời

27

Một phương pháp tiêu chuẩn là xác định preview như một thoáng qua thuộc tính trong mô hình Core Data (do đó giá trị không thực sự được lưu trữ trong cơ sở dữ liệu) và triển khai phương thức getter tùy chỉnh. Trong trường hợp của bạn nó sẽ trông như thế:..

- (NSString *)preview 
{ 
    [self willAccessValueForKey:@"preview"]; 
    NSString *preview = [self primitiveValueForKey:@"preview"]; 
    [self didAccessValueForKey:@"preview"]; 
    if (preview == nil) { 
     if ([self.body length] < 200) { 
      preview = self.body; 
     } else { 
      preview = [self.body substringWithRange:NSMakeRange(0, 200)]; 
     } 
     [self setPrimitiveValue:preview forKey:@"preview"]; 
    } 
    return preview; 
} 

(Bạn có thể cung cấp getter tùy chỉnh, phương pháp setter cho tính @dynamic Tuy nhiên, Core Data tính không chỉ đơn giản là sao lưu bằng cách biến dụ Đó là lý do tại sao bạn không thể truy cập _preview.)

Nếu bạn cần preview được tính lại nếu body thay đổi thuộc tính, sau đó bạn cũng phải thực hiện một phương pháp tùy chỉnh setter cho body mà bộ preview trở lại nil.

Để biết thêm thông tin, hãy đọc Non-Standard Persistent Attributes trong "Hướng dẫn lập trình dữ liệu cốt lõi".

Cập nhật: Phiên bản hiện tại của Hướng dẫn lập trình dữ liệu lõi không không chứa chương đó nữa. Bạn có thể tìm thấy phiên bản đã lưu trữ từ Way Back Machine. Tất nhiên điều này phải được thực hiện với một hạt muối vì nó không phải là một phần của tài liệu chính thức nữa.

+0

Câu trả lời hoàn hảo @Martin. – satheeshwaran

+0

@satheeshwaran: Cảm ơn bạn. –

+0

Tất cả những gì cần làm là sử dụng phương pháp đó? Hoặc tôi phải làm gì đó trong tệp CoreData? – user212541

6

See documentation về việc sử dụng primitiveValueForKey:

cơ bản:

@dynamic name; 

- (NSString *)name 
{ 
    [self willAccessValueForKey:@"name"]; 
    NSString *myName = [self primitiveName]; 
    [self didAccessValueForKey:@"name"]; 
    return myName; 
} 

- (void)setName:(NSString *)newName 
{ 
    [self willChangeValueForKey:@"name"]; 
    [self setPrimitiveName:newName]; 
    [self didChangeValueForKey:@"name"]; 
} 
Các vấn đề liên quan