2012-03-09 23 views
5

Tôi mong đợi (hy vọng thậm chí) rằng đây sẽ là một câu hỏi ngu ngốc, nhưng sau khi đấu vật trong nhiều giờ với vấn đề này tôi cần một số thông tin chi tiết.Sao chép thực thể khi thay đổi được thực hiện bởi một đứa trẻ ManagedObjectContext được đẩy (đã lưu) cho phụ huynh của nó

Ứng dụng iOS 5.1 của tôi sử dụng MOC lồng nhau, có MOC ChildCueueConcurrency con, gọi là MOC-Child, có cha mẹ là MOC chính thống kê, gọi là MOC-Parent. MOC-Parent sẽ quay lại chế độ xem bảng hiển thị các thực thể của nó. MOC-Child được sử dụng bởi một trình phân tích cú pháp chạy không đồng bộ trên một chuỗi không chính, để tạo các thực thể mới tương ứng với các mô tả-thực thể XML được phân tích cú pháp từ một kết nối URL và sau đó đẩy các thực thể mới vào MOC- Phụ huynh, thông qua một lưu trên MOC-Child, hiển thị chúng trong một cái nhìn bảng. Đây hoạt động tuyệt vời:

1) Parser creates entity in MOC-Child 
2) Parser saves MOC-Child 
3) New entity is added to MOC-Parent 
4) New entity is displayed in MOC-Parent's table view 

Tuy nhiên, mô tả của bất kỳ tổ chức đưa ra trong thức ăn này có thể thay đổi theo thời gian, do đó thực thể mô tả nó cần phải được sửa đổi trong ứng dụng và di động trong chế độ xem bảng cập nhật. Vì vậy, đối với mỗi mô tả thực thể trong nguồn cấp dữ liệu, trình phân tích cố gắng tìm nạp thực thể (nếu có) trong MOC-Child có cùng id với thực thể được mô tả và nếu có so sánh giá trị của thực thể hiện tại với các giá trị mô tả xem có gì thay đổi không. Khi trình phân tích cú pháp phát hiện theo cách này một thực thể đã được sửa đổi, nó cập nhật các giá trị của thực thể hiện có trong MOC-Child với các giá trị mới trong mô tả, và sau đó lưu MOC-Child để đẩy các thay đổi lên MOC-Parent.

Đây là nơi mọi thứ xảy ra sai. Tôi đã nghĩ rằng những thay đổi được thực hiện cho một thực thể được tìm nạp trong MOC-Child sẽ, khi được đẩy tới cha mẹ bằng cách lưu nó, chỉ đơn giản là "xuất hiện" trong thực thể "tương tự" trong MOC-Parent. Tuy nhiên, những gì tôi thấy xảy ra là thực thể thay đổi từ MOC-Child đang được thêm vào MOC-Parent, như thể đó là một thực thể hoàn toàn riêng biệt và mới; với kết quả là MOC-phụ huynh, và do đó các bảng xem nó ổ đĩa, kết thúc với hai đơn vị cho mỗi thực thể chỉnh sửa:

1) Parser modifies existing entity in MOC-Child 
2) Parser saves MOC-Child 
3) Modified entity is _added to_ MOC-Parent 
4) Entity is displayed _twice_ in MOC-Parent's table view 

gì cho? Tôi cần phải làm gì để thay đổi các giá trị của một thực thể hiện tại trong MOC-Parent, nếu tôi không thể thực hiện nó trong MOC-Child? Và nếu tôi có thể làm như vậy trong MOC-Child, tôi cần phải làm gì hơn ngoài việc lưu MOC-Child để thực hiện các thay đổi trong MOC-Parent mà không cần thêm thực thể lần thứ hai?

Cảm ơn trước vì bất kỳ trợ giúp hoặc thông tin chi tiết nào bạn có thể cung cấp!

Carl

P.S. Một vài làm rõ. Khi tôi nói rằng thực thể thay đổi được thêm vào MOC-Parent, tôi có nghĩa là NSFetchedResultsController đang theo dõi các vấn đề MOC-Parent kiểu thay đổi NSFetchedResultsChangeInsert (không kiểu thay đổi NSFetchedResultsChangeUpdate) cho thực thể đã thay đổi, mặc dù " cùng "thực thể đã có mặt trong MOC-Parent.

Ngoài ra, khi tôi nói "cùng một thực thể", tôi có nghĩa là một thực thể trong MOC-cha mẹ có cùng một mô tả id cung cấp (trong trường hợp này là NSString) là thực thể được thay đổi trong MOC-con (không phải nhất thiết phải cùng một objectID, trên thực tế dường như có một objectId khác nhau).

+0

Tôi gặp vấn đề tương tự. Tôi có một NSFetchedResultsController gắn liền với các ngữ cảnh lồng nhau từ một UIManagedDocument. Tôi chỉ tải từ một máy chủ trên phụ huynh trong nền và sau đó hiển thị từ các con ở phía trước. Nhưng nó không hoạt động bình thường cho dù thế nào đi chăng nữa. Nếu tôi đóng ứng dụng và mở lại, nó tải hoàn toàn từ bộ nhớ tho. Odd. –

Trả lời

1

Tôi sẽ tưởng tượng rằng, vì đây là một câu hỏi cũ nên nó không còn là vấn đề nữa. Nhưng khi gần đây tôi thấy mình đang vật lộn với một tình huống tương tự, tôi đã nghĩ mình sẽ đưa ra giải pháp của mình.

Tôi tải xuống hàng nghìn đối tượng (được liên kết bởi một hoặc nhiều mã vạch) thành tệp XML, sau đó phân tích cú pháp và lưu theo lô trên ngữ cảnh nền bằng lớp con NSOperation. Ngữ cảnh đĩa (được kết nối với kho lưu trữ liên tục) lắng nghe cho NSManagedObjectContextDidSaveNotification, tại thời điểm đó nó cũng lưu (nhớ làm như vậy trong một khối).

[self.diskManagedObjectContext performBlockAndWait:^{ 
    NSError *error; 
    if (![self.diskManagedObjectContext save:&error]) { 
     NSLog(@"error saving to disk: %@",error); 
    } 
}]; 

Phần khó khăn là bất kỳ mã vạch của đối tượng nào có thể được quét (trong ngữ cảnh giao diện người dùng) trước khi tệp XML được phân tích cú pháp đầy đủ và thông tin được tải vào cơ sở dữ liệu. Và tôi có chế độ xem bảng được hỗ trợ bởi NSFetchedResultsController hiển thị các đối tượng được quét, hiển thị "không xác định" trong tiêu đề của chúng cho đến khi dữ liệu được truy xuất từ ​​tải nền. Giống như trong tình huống của Carl, các đối tượng này cần phải được cập nhật khi bối cảnh nền lưu lại.

Để xử lý điều này, tôi sử dụng hệ thống ba ngữ cảnh tương tự như trong this question, với ngữ cảnh giao diện người dùng và bối cảnh nền, cả hai đều là con của ngữ cảnh đĩa chính của tôi (được gắn với cửa hàng liên tục). Vì vậy, trong quá trình phân tích cú pháp XML, tôi chạy truy vấn trên mã vạch của đối tượng trong ngữ cảnh nền (cũng có thể kéo từ ngữ cảnh ổ đĩa gốc) để xem một đối tượng đã được tạo bằng mã vạch đó hay chưa. Nếu có, tôi chỉ cập nhật thông tin, lưu lại, đặt lại ngữ cảnh đĩa và gọi refreshObject: mergeChanges: từ ngữ cảnh giao diện người dùng để kéo những thay đổi này từ ngữ cảnh đĩa. Điều này làm mới thành công bảng mà không tạo bản sao. Ban đầu tôi đã thử điều này bằng cách chỉ sử dụng hai bối cảnh, ngữ cảnh nền và ngữ cảnh giao diện người dùng, nhưng trong khi tôi không bao giờ kết thúc việc tạo đối tượng trùng lặp, tôi đã thực sự tốt khi treo chuỗi giao diện người dùng.

Tôi đoán câu hỏi quan trọng là Bạn sửa đổi thực thể hiện tại như thế nào? Và đừng quên thiết lập lại.

+0

Thực ra, tôi chưa giải quyết được vấn đề này, vì vậy nó vẫn còn khá hiện tại, ít nhất là đối với tôi. (Tôi chỉ punted về vấn đề này bằng cách làm phân tích như là một nhiệm vụ không đồng bộ trên thread chính - xa lý tưởng, tất nhiên!) Khi tôi có cơ hội, tôi sẽ làm lại chương trình phân tích cú pháp của tôi để thử giải pháp của bạn. Trong khi chờ đợi, cảm ơn thông tin! –

+0

Điều chắc chắn. Nếu bạn muốn biết thêm thông tin khi bạn dùng thử, hãy cho tôi biết và tôi sẽ cung cấp chi tiết hơn một chút về giải thích. – enjayem

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