2016-07-23 17 views
6

Ứng dụng của tôi kết nối với dịch vụ web, thực hiện POST từ 3 phương thức khác nhau và chèn từng bộ 3 dữ liệu này vào Dữ liệu chính. Mọi dữ liệu mới đều có sẵn mọi thứ trong dữ liệu lõi sẽ bị xóa và dữ liệu mới được chèn vào. Mỗi phương thức trong số 3 phương thức này được hiển thị trong TableViewControllers khác nhau, có nghĩa là hơn 3 lần tải mỗi lần một trong số TableViewControllers này được hiển thị.Chuỗi chính xác để thực hiện xóa, chèn và tìm nạp từ/tới Dữ liệu chính

Kết thúc mọi thứ, chúng tôi có 3 bộ dữ liệu được tìm nạp từ một dịch vụ web và sau đó tôi chèn tất cả các dữ liệu này vào các thực thể khác nhau trong khi tìm nạp dữ liệu mới để hiển thị trong chính TableViewController.

Bây giờ tôi đang đấu tranh với mối quan hệ phức tạp của các chủ đề và cấu trúc dữ liệu cốt lõi đa ngữ cảnh. Tôi nên thực hiện chèn, xóa và tìm nạp ở đâu để đảm bảo an toàn luồng của ứng dụng?

+0

Bạn có bao nhiêu dữ liệu? Hiện tại bạn đang có ngữ cảnh và chủ đề gì? – Wain

+0

@Wain Data tương đối nhỏ. Khoảng một nghìn bản ghi trong mỗi thực thể. NSURLSession đang làm việc với một completionhandler trên chủ đề chính. Sau đó, nó gọi một phương thức để xóa (được thực hiện trên chuỗi chính NSMainQueueConcurrencyType) và chèn (chủ đề chính/NSPrivateQueueConcurrencyType). Sau đó, tìm nạp về chủ đề chính và ngữ cảnh chính. – user3687

Trả lời

1

Trong đa ngữ CoreData, Bạn có thể có privateQueueRootMOC và mainQueueRootMoc, MOC chính được sử dụng để lấy dữ liệu trong mainThread, MOC riêng được sử dụng để cập nhật, chèn và xóa dữ liệu trong chuỗi privateMOC.

privateMOC.performBlock({() -> Void in 
    //try insert, delete, update 
    .... 
    try privateMOC.save() 
    onCompleteBlock() //fetch data in main thread use main MOC 
}) 
+0

Ok bây giờ tôi di chuyển chèn và xóa để thực hiện khối MOC tư nhân và nó có vẻ là làm việc tốt. Nhưng có một vấn đề, khi tôi làm mới tất cả mọi thứ (kết nối với webservice, xóa và chèn vào dữ liệu cốt lõi) sau đó tôi thực hiện một lấy nó trả về nil cho một vài giây. Có vẻ như xóa đang được lưu trên ngữ cảnh chính trước khi dữ liệu mới được chèn vào. – user3687

+0

Trong MOC chính, bạn nên thêm một khối gọi lại hoàn chỉnh sau tệp privateMOC.save() và đọc dữ liệu từ chủ đề chính sử dụng MOC chính. Hoặc bạn có thể sử dụng NSFetchResultController trong MOC chính, để quan sát dữ liệu thay đổi trong CoreData. – Hao

4

Làm giao diện người dùng tìm nạp trên chuỗi chính từ ngữ cảnh chính.

Để nhập, không chạy cuộc gọi lại phiên trên chuỗi chính, chạy nó trên bất kỳ hàng đợi nền nào. Tạo một bối cảnh riêng tư mới và thiết lập chính làm cha mẹ của nó. Trong phiên gọi lại sử dụng giao diện khối để nhập khẩu và lưu bối cảnh nền và sau đó cha mẹ của nó (một lần nữa, bằng cách sử dụng giao diện khối).

+0

Chúng tôi đã thử gửi các cuộc gọi lại phiên trên một chuỗi nền và tiếp tục chèn trên MainThread, nhưng chúng tôi đã gặp một số vấn đề liên quan đến SaveContext trên MainContext. Chính xác bạn muốn nói gì về "sử dụng giao diện khối để nhập"? Tôi không hoàn toàn hiểu bạn. – user3687

+0

'NSManagedObjectContext' cung cấp giao diện khối để bạn gửi mã được thực hiện một cách an toàn – Wain

+0

Kết quả này trong luồng chính bị chặn và giao diện người dùng không phản hồi trong khi chèn dữ liệu vào dữ liệu lõi. Tôi nghĩ rằng việc xóa và chèn phải được thực hiện trên một chủ đề khác. Nhưng một lần nữa khi tôi làm điều này dữ liệu tôi lấy đôi khi sai và giống như tìm nạp của nó không được thực hiện hoàn toàn. – user3687

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