7

Tôi đang tìm hiểu về CoreData. Rõ ràng, một trong các lớp chính bạn entouer là NSManagedObjectContext. Tôi không rõ ràng về vai trò chính xác của điều này. Từ các bài báo tôi đã đọc, có vẻ như bạn có thể có nhiều NSManagedObjectContexts. Điều này có nghĩa rằng NSManagedObjectContext về cơ bản là một bản sao của phụ trợ?NSManagedObjectNext bối rối

Điều này sẽ giải quyết như thế nào với một chương trình phụ trợ nhất quán khi có nhiều bản sao khác nhau nằm xung quanh?

Vì vậy, 2 câu hỏi về cơ bản:

NSManagedContext một bản sao của cơ sở dữ liệu phụ trợ?

và ...

Ví dụ, nói tôi thực hiện một sự thay đổi trong bối cảnh A và thực hiện một số thay đổi khác trong bối cảnh B. Sau đó, tôi gọi tiết kiệm trên A đầu tiên, sau đó B? B sẽ thắng thế nào?

Cảm ơn

Trả lời

11

NSManagedObjectContext không phải là bản sao của cơ sở dữ liệu phụ trợ. Các documentation mô tả nó như là một pad đầu

Một thể hiện của NSManagedObjectContext đại diện cho một đơn “đối tượng không gian” hoặc trầy xước pad trong một ứng dụng. Trách nhiệm chính của nó là để quản lý bộ sưu tập các đối tượng được quản lý. Các đối tượng này tạo thành một nhóm của các đối tượng mô hình có liên quan đại diện cho chế độ xem nhất quán nội bộ của một hoặc nhiều cửa hàng liên tục. Một cá thể đối tượng được quản lý duy nhất tồn tại trong một và chỉ một ngữ cảnh, nhưng nhiều bản sao của một đối tượng có thể tồn tại trong các ngữ cảnh khác nhau. Vì vậy, đối tượng uniquing được scoped đến một ngữ cảnh cụ thể .

NSManagedObjectContext chỉ là nơi tạm thời để thay đổi đối tượng được quản lý theo cách giao dịch. Khi bạn thực hiện thay đổi đối tượng trong ngữ cảnh, nó không ảnh hưởng đến cơ sở dữ liệu phụ trợ cho đến khi và nếu bạn lưu ngữ cảnh, và như bạn biết bạn có thể có nhiều ngữ cảnh mà bạn có thể thực hiện các thay đổi thực sự quan trọng đối với concurrency.

Đối với câu hỏi số 2, câu trả lời cho người thắng sẽ phụ thuộc vào số merge policy bạn đặt cho ngữ cảnh và ngữ cảnh nào được gọi là cuối cùng B. Đây là chính sách hợp nhất có thể được đặt sẽ ảnh hưởng đến ngữ cảnh thứ hai để được cứu.

NSErrorMergePolicyType
Chỉ định một chính sách gây ra một lưu thất bại nếu có bất kỳ xung đột nhập.

NSMergeByPropertyStoreTrumpMergePolicyType
Chỉ định một chính sách mà kết hợp mâu thuẫn giữa phiên bản cửa hàng liên tục của các đối tượng và phiên bản hiện tại trong bộ nhớ, ưu tiên thay đổi bên ngoài.

NSMergeByPropertyObjectTrumpMergePolicyType
Chỉ định một chính sách kết hợp mâu thuẫn giữa phiên bản cửa hàng dai dẳng của của đối tượng và phiên bản hiện tại trong bộ nhớ, ưu tiên thay đổi trong bộ nhớ.

NSOverwriteMergePolicyType
Chỉ định một chính sách mà ghi đè nhà nước trong các cửa hàng liên tục cho các đối tượng thay đổi trong xung đột.

NSRollbackMergePolicyType
Chỉ định một chính sách mà vứt bỏ trong bộ nhớ thay đổi trạng thái cho các đối tượng trong cuộc xung đột.

+0

"đồng thời". liên kết đã hết hạn. –

+0

@ Mr.UB Đã giải quyết, cảm ơn. – Joe

2

NSManagedObjectContext là đại diện cụ thể của mô hình dữ liệu của bạn. Mỗi ngữ cảnh duy trì trạng thái riêng của nó (ví dụ: ngữ cảnh) để các thay đổi trong một ngữ cảnh sẽ không ảnh hưởng trực tiếp đến các ngữ cảnh khác. Khi bạn làm việc với nhiều bối cảnh, trách nhiệm của bạn là giữ cho chúng nhất quán bằng cách hợp nhất các thay đổi khi bối cảnh lưu các thay đổi của nó vào cửa hàng.

Câu hỏi của bạn liên quan đến quá trình này và cũng có thể liên quan đến xung đột hợp nhất. Bất cứ khi nào bạn lưu một ngữ cảnh, các thay đổi của nó được cam kết với cửa hàng và chính sách hợp nhất được sử dụng để giải quyết xung đột.

Khi bạn lưu ngữ cảnh, nó sẽ đăng các thông báo khác nhau về tiến độ. Trong trường hợp của bạn, nếu [contextA save:&error] thành công, ngữ cảnh sẽ đăng thông báo NSManagedObjectContextDidSaveNotification. Khi bạn có nhiều bối cảnh, bạn thường quan sát được thông báo này và gọi:

[contextB mergeChangesFromContextDidSaveNotification:notification]; 

này sẽ hợp nhất các thay đổi được lưu trên contextA vào contextB.

EDIT: xóa nhận xét 'an toàn chỉ'. NSManagedObjectContext không phải là chủ đề an toàn.

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