2012-04-03 26 views
11

Theo câu trả lời Daniel Eggert trong this question, khi sử dụng một bối cảnh đối tượng được quản lý với NSPrivateQueueConcurrencyType đó là cần thiết để làm bất cứ điều gì mà chạm vào nó hoặc đối tượng thuộc về nó trong vòng performBlock: hoặc performBlockAndWait:Có cần phải đọc Dữ liệu cốt lõi trong performBlock khi sử dụng NSMainQueueConcurrencyType không?

là giống nhau đúng đối với NSMainQueueConcurrencyType? Hãy tưởng tượng đoạn mã sau chạy trên các chủ đề chính, trong một UIViewController ví dụ:

self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease]; 
//moc setup 

__block RHWidget *widget = nil; 

[self.moc performBlockAndWait:^{ 
    widget = [(RHWidget *)[self.moc objectWithID:self.widgetObjectID] retain]; 
}]; 

self.labelView.text = widget.descriptionString; 

[widget release]; 

Có an toàn để sử dụng widget bên ngoài khối, vì chúng ta biết chúng ta đang ở trên các chủ đề chính? Hoặc nó là cần thiết để làm điều này:

__block NSString *description = nil; 

[self.moc performBlockAndWait:^{ 
    RHWidget *widget = (RHWidget *)[self.moc objectWithID:self.widgetObjectID]; 
    description = [widget.descriptionString copy]; 
}]; 

self.labelView.text = description; 

[description release]; 

Đừng mọi thứ thay đổi nếu có NSManagedObjectContext khác trên mạng, khả năng của các loại hàng đợi tin, làm việc trong các khối và đẩy những thay đổi lên đến self.moc như một parentContext?

Đây là một ví dụ hơi khó hiểu, nhưng sẽ rất tuyệt khi chuyển một cách an toàn tiện ích đó đến, ví dụ, một bộ điều khiển chế độ xem cần truy cập một số thuộc tính của tiện ích. Tôi có nên vượt qua objectID của tiện ích thay thế và tìm nạp nó trong vòng performBlock: trong trình điều khiển chế độ xem mới không?

+0

Có một bài viết rất toàn diện [ở đây] (http://www.cocoanetics.com/2012/07/multi-context-coredata/) mô tả các cách tiếp cận khác nhau bao gồm các loại tương tranh ngữ cảnh và bối cảnh lồng nhau. –

Trả lời

6

Cập nhật: Theo WWDC 2011 Session 303 (What's New in Core Data on iOS), NSMainQueueConcurrencyType được thiết kế để cho phép nhắn tin thông thường trên chuỗi chính; bạn chỉ cần sử dụng -performBlock: khi tương tác với ngữ cảnh từ một chuỗi khác. (Phần tĩnh có liên quan của câu trả lời ban đầu của tôi dưới đây.)


Tôi đã thực hiện một hai ứng dụng hoặc có thể sửa đổi mẫu mặc định "Master-Detail" ứng dụng Xcode để làm cho "chính" MỘC (tạo ra bởi các ứng dụng ủy nhiệm và chuyển giữa các bộ điều khiển chế độ xem) chỉ có hàng đợi chính và phụ huynh vào ngữ cảnh hàng đợi riêng mà tôi sử dụng cho các hoạt động nền như nhập dữ liệu từ tìm nạp trên web. Do đó, hầu hết việc sử dụng bối cảnh và các đối tượng của nó xảy ra mà không bị bọc trong performBlock:. (Lần duy nhất tôi sử dụng performBlock: là để đẩy các thay đổi từ ngữ cảnh nền nhiệm vụ trở lại ngữ cảnh chính để cập nhật giao diện người dùng.) Hoạt động tốt.

+0

Đó là nhiều hơn hoặc ít hơn những gì tôi đang làm; Tôi đã có một singleton với một 'NSOperationQueue' và một bối cảnh với' NSPrivateQueueConcurrencyType' được truyền cho mỗi hoạt động. Các hoạt động đó tìm nạp các đối tượng, thực hiện công việc của họ, lưu ngữ cảnh cục bộ, sau đó lưu ngữ cảnh gốc, tất cả trong 'performBlock:'. Mọi thứ dường như hoạt động tốt, nhưng tôi lo lắng về một điều kiện chủng tộc không lường trước được hoặc quản lý bộ nhớ. – roland

+0

@roland. Tôi không nghĩ rằng đây là một phương pháp an toàn bởi vì một NSOperationQueue có thể sử dụng một số chủ đề (ngay cả khi maxConcurrentOperationCount của nó là 1). Khi bạn đang sử dụng mecanism bối cảnh cha/con, bạn sẽ có ít vấn đề tương tranh vì nó luôn luôn là bối cảnh cha mẹ truy cập vào cửa hàng. – FKDev

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