2011-01-27 25 views
5

các tài liệu nhà nước:cách 'đúng' để sử dụng objectWithID NSManagedObjectContext của những gì:

... Phương pháp này luôn trả về một đối tượng. Dữ liệu trong cửa hàng liên tục được đại diện bởi objectID được giả định là tồn tại — nếu không, đối tượng trả lại sẽ xuất ngoại khi bạn truy cập bất kỳ thuộc tính nào (tức là khi lỗi được kích hoạt). Lợi ích của hành vi này là nó cho phép bạn tạo và sử dụng lỗi, sau đó tạo hàng bên dưới sau hoặc trong ngữ cảnh riêng biệt.

và trong ứng dụng mẫu 'Lõi Công thức' của Apple kết quả của phương pháp này được sử dụng để cư trú một NSFetchRequest, và sau đó kết quả của yêu cầu được sử dụng, với ý kiến ​​về việc đó:

// first get the object into the context 
Recipe *recipeFault = (Recipe *)[context objectWithID:objectID]; 

// this only creates a fault, which may NOT resolve to an object (for example, if the ID is for 
// an objec that has been deleted already): create a fetch request to get the object for real 
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity: [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:context]]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(self == %@)", recipeFault]; 
        [request setPredicate: predicate]; 

Tôi có thấy nhiều ví dụ (mã khác, và 'iClass' của quả táo), kết quả từ objectWithID được sử dụng trực tiếp - có nghĩa là, các thuộc tính của nó được truy cập và xử lý vui vẻ cùng.

Nên objectWithIDluôn là được coi là đối tượng 'có thể tồn tại' này không?

Tôi hỏi vì tôi vừa mới chạy vào điều này và đã không tìm nạp được sự tồn tại của nó.

Trả lời

4

Tài liệu Apple đang cho bạn biết là không cho rằng đối tượng tồn tại là cửa hàng liên tục, chỉ vì một đối tượng được trả về.

Bạn có thể xử lý nó như thể nó, truy cập các thuộc tính của nó và như vậy, bởi vì trong nền lõi dữ liệu sẽ truy cập vào kho dữ liệu để phục vụ yêu cầu của bạn. Tuy nhiên, nếu đối tượng không tồn tại trong cửa hàng, bạn sẽ nhận được một ngoại lệ.

Here's Apple's documentation explaining faults (đó là những gì objectWithID: đang trả lại cho bạn).

+0

tôi đoán những gì tôi không hiểu là, sau đó, nếu nó bằng cách nào đó 'tốt hơn' hoặc 'thích hợp hơn' để làm fetchRequest, sử dụng đối tượng quay trở lại để tìm hiểu xem nó có tồn tại hay không. cố gắng truy cập các thuộc tính của nó, và lấy lại một ngoại lệ vì đối tượng không tồn tại? là cái thứ hai, một loại lối tắt, hay là nó bị bệnh? – lulu

+0

Câu trả lời là "nó phụ thuộc". Nếu bạn đang mã hóa cho một tình huống mà bạn biết đối tượng sẽ tồn tại, ví dụ như nơi người dùng không có khả năng xóa đối tượng, thì hãy tiếp tục. Nếu nó có thể không tồn tại, thì bạn sẽ phải thực hiện yêu cầu tìm nạp hoặc bắt ngoại lệ. Đó là thích hợp hơn? Tôi đoán đó là một câu hỏi về phong cách. Tôi có thể nghiêng về phía yêu cầu tìm nạp. – paulbailey

+0

cảm ơn, paulbailey. – lulu

1

Tôi tìm thấy bài viết này Safely fetching an NSManagedObject by URI để chứa một phương pháp tất cả trong một tốt đẹp để lấy một đối tượng sử dụng objectWithID: nhưng nếu nó được tìm thấy là một lỗi, hãy tiếp tục và tìm nạp nó. Phương pháp này chi tiết hơn một chút trong việc xử lý các URI đối tượng, nhưng kỹ thuật cốt lõi được trình bày là một phần mở rộng hữu ích cho các cuộc thảo luận trong câu hỏi này.

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