2012-04-01 37 views
5

Tôi có một vấn đề cơ bản đồng bộ hóa openWithCompletionHandler: (UIManagedDocument) với các hoạt động chính.iOS5.1: đồng bộ hóa các tác vụ (chờ hoàn thành)

Tình huống: Tôi có một lớp singleton quản lý UIManagedDocument được chia sẻ. Lớp này cung cấp một phương pháp sẽ phân phối tài liệu ở trạng thái bình thường (ví dụ: tạo hoặc mở tài liệu, bất kỳ điều gì cần thiết). Nhưng vì openWithCompletionHandler: thực hiện công việc chính của nó không đồng bộ trong nền chương trình của tôi nên đợi bằng cách thiết lập fetchedResultsController cho đến khi tài liệu thực sự mở. Phương thức "viewWillAppear" (hiện tại) không tạo ra đầu ra hữu ích khi cơ sở dữ liệu chưa sẵn sàng. Đợi sẽ ổn với tôi, nhưng nhận được thông báo có lẽ sẽ là cách tốt hơn. Có lẽ viewWillAppear hóa ra không phải là điểm thích hợp để setupFetchedResultsController vì không được gọi trong một runloop.

Có mẫu chuẩn nào để đạt được điều này không?

Bit nhiều nền (không quan trọng như vậy tôi giả định) Tôi đang làm việc trên một ứng dụng iOS 5.1 nhỏ liên quan đến CoreData UIManagedDocument. Tôi giống như ví dụ từ Bài 14 từ khóa học Stanford mùa thu năm ngoái trong iTunes-U. Mọi thứ đều hoạt động tốt cho đến khi tôi cố gắng xử lý UIManagedDocument khỏi lớp UITableViewController thành một lớp riêng biệt xử lý tài liệu của tôi. Trong phiên bản gốc, FetchedResultsController được thiết lập trong trình xử lý hoàn thành.

Trả lời

3

Tôi đề xuất sau bài đăng tuyệt vời Justin Driscoll trên Core Data with a Single Shared UIManagedDocument.

Bạn sẽ tìm thấy một bản ghi hoàn chỉnh trên đĩa đơn UIManagedDocument và ví dụ về performWithDocument. Mã thiết lập fetchedResultsController của bạn thực sự nên đi trong khối performWithDocument:^{}.

Cũng lưu ý rằng openWithCompletionHandler không phải là chủ đề an toàn - lời gọi đồng thời của performWithDocument trong khi mở tài liệu sẽ gây ra sự cố. Giải pháp cho tôi là không tầm thường (và khá cụ thể cho ứng dụng), vì vậy nếu bạn gặp vấn đề tương tự, tôi đề nghị bạn xem xét UIDocumentStateChangedNotification để thông báo thay đổi trạng thái tài liệu và có thể là điểm đồng bộ hóa của bạn cho nhiều trình mở tài liệu.

Một số đoạn nếu bạn quan tâm,

đầu tiên trong init MYDocumentHandler của, thiết lập một thông báo thêm ở cuối:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(documentStateDidChange:) 
               name:UIDocumentStateChangedNotification 
               object:self.document]; 

Sau đó, trong performWithDocument, @synchronized (self.document) trên mở quan trọng/tạo các phần để đảm bảo chỉ có một chuỗi nhập vào một thời điểm và chặn các chuỗi tiếp theo cho đến khi mở/tạo thành công.

Cuối cùng thêm chức năng sau:

- (void)documentStateDidChange:(NSNotification *)notification 
{ 
    if (self.document.documentState == UIDocumentStateNormal) 
     @synchronized (self.document) { 
      ... unblock other document openers ... 
     } 
} 

Đối với khối/đề bỏ chặn, YMMV. Tôi đã sử dụng dispatch_semaphore_t cùng với một số dispatch_queues để đáp ứng các yêu cầu dành riêng cho ứng dụng. Trường hợp của bạn có thể đơn giản như chờ đợi hoàn thành hoặc xóa các chủ đề khác.

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