2012-07-04 24 views
18

Tôi hiện đang gặp sự cố khi tạo đối tượng mới trên chuỗi con nền (có cha mẹ là ngữ cảnh chủ đề giao diện người dùng chính) và tiết kiệm nguyên nhân của tôi NSFetchedResultsController để hiển thị hai đối tượng mới: một với một tạm thời objectID và một vĩnh viễn objectID. Điều này có vẻ là một lỗi của một số loại, trừ khi tôi đang thiếu một cái gì đó.Thời điểm gọi getPermanentIDsForObjects :?

Vì vậy, tôi nghĩ mình sẽ có được ID cố định theo cách thủ công cho bất kỳ đối tượng mới nào tôi tạo. Điều này khắc phục vấn đề hàng trùng lặp, nhưng giới thiệu các lỗi ngẫu nhiên mới (chẳng hạn như "không thể thực hiện lỗi cho đối tượng", tham chiếu đến đối tượng mới mà tôi đã tạo). Nếu bất kỳ ai có bất kỳ ý tưởng nào về lý do tại sao bất kỳ điều nào đã được đề cập trước đây đang xảy ra, vui lòng chia sẻ.

Tôi đoán obtainPermanentIDs là một bước đi đúng hướng. Nhưng khi nào tôi gọi phương pháp này? Trước khi lưu vào bối cảnh con? Sau khi lưu đứa trẻ và trước cha mẹ? Sau khi cha mẹ? Hiện nay thiết lập của tôi là thế này:

masterMOC - private queue tied to the persistent store, so physical saves happen here 
----mainMOC - main queue tied to the UI, child of masterMOC 
-------backgroundMOC - private queue, child of mainMOC 

Vì vậy, nếu tôi có thể tạo một đối tượng mới trên backgroundMOC, và tôi có ý định lập tức lưu vào đĩa (có nghĩa là tôi sẽ phải gọi tiết kiệm: trên cả ba bối cảnh), nơi tôi có nên gọi số obtainPermanentIDs không?

(hoặc nếu có ai có một giải pháp khác ngoài gọi lấy id vĩnh viễn vấn đề gì là phương pháp này giới thiệu để giải quyết nào Tại sao tôi muốn gọi phương pháp này??)

Cập nhật: Tôi nghĩ Tôi đã tìm ra những gì đang xảy ra (mặc dù nó chỉ là một lý thuyết), mặc dù không phải là cách giải quyết nó. Dữ liệu cốt lõi dường như tạo ID cố định cho các đối tượng khi chúng được lưu vào ổ đĩa. Vì vậy, trong trường hợp của tôi, điều này sẽ không xảy ra cho đến khi tôi gọi lưu trên masterMOC. Hiện nay những gì tôi làm khi tạo một đối tượng mới trên backgroundMOC là:

  1. tiết kiệm trên backgroundMOC (vì vậy mà thay đổi được đẩy lên một cấp đến mainMOC và xem bàn của tôi có thể chèn các hàng mới)
  2. tiết kiệm trên mainMOC (vì vậy mà tôi có thể chuẩn bị để lưu lên đĩa)
  3. tiết kiệm masterMOC (mà cuối cùng tiết kiệm vào đĩa)

gì đang xảy ra ở đây là kêu gọi tiết kiệm trên backgroundMOC gây nên một bản cập nhật giao diện người dùng, và làm cho bộ điều khiển kết quả được tìm nạp để chèn một đối tượng mới vẫn còn trên ly ID tạm thời. Nhưng sau đó gọi lưu trên masterMOC gây ra tất cả các đối tượng để có được ID vĩnh viễn được chỉ định, gây ra một cập nhật giao diện người dùng khác, chèn một hàng khác cho đối tượng "mới" này! Bằng cách bình luận lưu masterMOC cuối cùng, tôi không còn thấy các mục trùng lặp nữa. Tôi có làm gì sai ở đây không, hay đây là một loại lỗi nào đó?

Cập nhật khác: Tôi nghĩ rằng tôi đã xác nhận khá nhiều lỗi. Tôi gọi lưu trên backgroundMOC và sau đó thiết lập một bộ đếm thời gian để gọi lưu trên mainMOC và masterMOC 5 giây sau đó. Immediatley khi lưu vào backgroundMOC, một hàng mới được chèn vào bảng của tôi. 5 giây sau (khi lưu chính và chính), một hàng mới được chèn vào. (hàng được chèn đầu tiên có id tạm thời và chèn mới nhất có id cố định).

Trả lời

11

Tôi đã có cùng một vấn đề chính xác, tất nhiên sau một ngày đặc biệt khó khăn và phân tán gỡ lỗi mọi thứ để tìm ra vấn đề là ID tạm thời.:)

Tôi có cấu trúc chính xác giống như bạn và tôi cũng có các lớp con của NSManagedObjectContext để mã hóa hành vi tôi mong muốn lưu trong nền và ngữ cảnh chính - cụ thể là, lưu trong bối cảnh nền phải lưu ngữ cảnh chính (và bối cảnh chính nên đồng bộ hóa bất kỳ đối tượng nào đã thay đổi với dịch vụ bên ngoài, không liên quan nhưng đáng nhắc đến như là một giải thích cho lý do tại sao tôi có hai lớp con) và lưu trong bối cảnh chính sẽ lưu bối cảnh chính.

Trong lớp con RFSImportContext tôi (tương đương với backgroundMOC của bạn), tôi thực hiện - save: gọi [super save:], sau đó gọi [self.parentContext performBlock:] (self.parentContext ở đây là tương đương với mainM của bạn) C, nơi khối gọi obtainPermanentIDsForObjects: với các nội dung của chính bối cảnh - updatedObjects- insertedObjects mảng, sau đó tôi lưu ngữ cảnh chính.

Tôi không còn bị rò rỉ các đối tượng tạm thời vào NSFetchedResultsController khi bạn mô tả. Một cách để cải thiện tình huống một chút sẽ là sử dụng lớp con RFSMainContext (một lần nữa, tương đương với mainMOC của bạn) để thực hiện - save: để lấy các ID đối tượng cố định, lưu chính nó, sau đó lưu bối cảnh chủ. Điều này sẽ mã hóa hành vi mà chúng tôi luôn muốn bối cảnh chính để có ID cố định cho các đối tượng trong đó khi nó được lưu.

+2

nhận xét của bạn bằng cách nào đó đã giúp tôi nhưng theo một cách khác. Tôi đã sử dụng một NSFetchedresultscontroller và nó đã nhận được temporaryIds cũng như vĩnh viễn. Vì vậy, mọi lúc các cuộc gọi điều khiển didchangecontent tôi thực hiện một obtainPermanentIDsForObjects: cho tất cả các đối tượng được tìm nạp và nó hoạt động hoàn hảo ngay bây giờ! –

+0

@ JoãoNunes vẫn không hoạt động đối với tôi, id của tôi đã vĩnh viễn và lỗi này vẫn đang nhắc –

+0

Bạn có lỗi gì? –

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