2011-09-13 21 views
6

Tôi có một lớp con NSManagedObjectMyClass với thuộc tính myProp, được xác định @dynamic. Có nhiều trường hợp đọc số myProp trong mã của tôi, qua số [myClass myProp].Mục tiêu-C: ghi đè bộ thu động động

Bây giờ, tôi muốn xác định bộ thu gọn (trả về myProp sau khi thêm thứ gì đó vào nó) cho myProp, mà không thay đổi các cuộc gọi khác nhau thành [myClass myProp]. nghĩa là không tạo trình khởi động được đặt tên khác ngoài getMyProp.

Câu hỏi của tôi là, nếu tôi tạo bộ thu thập getMyProp, điều này sẽ ghi đè bộ thu thập được tạo bởi NSManagedObject, làm cách nào để truy cập giá trị ban đầu được lưu trữ trong cơ sở dữ liệu?

Cảm ơn,

Akshay

Trả lời

17

Để truy cập vào các giá trị cơ bản của một đối tượng được quản lý bạn sử dụng hai phương pháp sau đây:

- (id)primitiveValueForKey:(NSString *)key

- (void)setPrimitiveValue:(id)value forKey:(NSString *)key

này thường được dùng để chuyển đổi thuộc tính NSNumber thành loại 'thực' của chúng, ví dụ: thuộc tính bool:

- (BOOL)isShared 
{ 
    [self willAccessValueForKey:@"isShared"]; 
    NSNumber *underlyingValue = [self primitiveValueForKey:@"isShared"]; 
    [self didAccessValueForKey:@"isShared"]; 
    return [underlyingValue boolValue]; 
} 

Các willAccessValueForKey:didAccessValueForKey: được yêu cầu của cơ bản lớp đối tượng quản lý để xử lý lỗi và các mối quan hệ, vv

Và nếu bạn làm kết thúc viết một setter, bạn cũng phải quấn accessor trong các phương pháp KVC:

- (void)setShared:(BOOL)isShared 
{ 
    NSNumber *newUnderlyingValue = [NSNumber numberWithBool:isShared]; 
    [self willChangeValueForKey:@"isShared"]; 
    [self setPrimitiveValue:newUnderlyingValue forKey:@"isShared"]; 
    [self didChangeValueForKey:@"isShared"]; 
} 

Khi đó, cá nhân tôi không khuyên bạn nên giữ cùng tên phương pháp trừ khi bạn có lý do chính đáng. Đối với các giá trị 'có nguồn gốc', bạn thường muốn tạo một phương thức hoàn toàn mới với một tên khác. Không mất nhiều thời gian để tìm kiếm/thay thế nhanh chóng trong suốt mã của bạn.

EDIT: thêm willAccessValueForKey:/didAccessValueForKey: (nhờ jrturton)

+0

Bạn cũng cần phải đặt dấu ngoặc đang getter của bạn với 'willAccessValueForKey:' và 'didAccessValueForKey:' để đảm bảo rằng những lỗi lầm đều bị sa thải nếu cần thiết? – jrturton

+0

Vâng, cảm ơn tôi đã bỏ lỡ điều đó, tôi đã cập nhật mã. –

+0

Cảm ơn rất nhiều Mike! – Akshay

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