2011-12-28 8 views
5

Vấn đề: Tôi đang làm việc trên tài liệu iCloud trên thiết bị A, ví dụ: iPod Touch. Sau đó, tôi thay đổi tên của tài liệu trên thiết bị B, ví dụ: Mac của tôi (thông qua Finder). Thay đổi sẽ chuyển sang đám mây và sau khi thiết bị tạm dừng A được nghe về nó.iCloud - đổi tên tài liệu đang mở trên thiết bị khác đôi khi không thành công

Và sau đó:

  • một số trong những thời gian tất cả chỉ là tốt - Tôi nhặt thay đổi tên qua một thay đổi fileURL bất động sản và có thể cập nhật giao diện của tôi phù hợp - các tài liệu tiếp tục hệt như nó phải
  • một số thời gian, tệp tin của tài liệu URL được trả lại dưới dạng một cái gì đó như: file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95 Không ngạc nhiên khi tệp này sẽ không lưu.

Bất cứ ai có thể giải thích điều gì đang xảy ra và cách khắc phục?

nền

  • Sự thay đổi tên được chọn tốt bởi bởi NSMetadataQuery. Vì vậy, ví dụ: tôi có thể đổi tên tài liệu không mở và tất cả chức năng iCloud của tôi hoạt động tốt. Vấn đề này dường như chỉ xảy ra với các tài liệu mở.

  • Các tính năng khác của iCloud hoạt động tốt, ví dụ: Tôi có thể thay đổi nội dung trên một thiết bị, ví dụ: máy Mac của tôi và phát hiện rồi cập nhật giao diện của tôi trên một thiết bị khác, ví dụ: iPod Touch của tôi, có tài liệu iCloud liên quan mở.

  • Lần đầu tiên tôi phát hiện ra điều này khi tôi thêm ghi đè cho presentedItemDidMoveToURL: vào lớp con UIDocument của mình. Ghi đè đáng tin cậy nhận các thay đổi về tên được thực hiện trong đám mây, ví dụ: đổi tên tài liệu trên một thiết bị khác. Sau đó, đôi khi newURL là URL dự kiến ​​cuối cùng cho tài liệu được đổi tên, nghĩa là một cái gì đó hợp lý mà từ đó tôi có thể trích xuất tên mới sử dụng `lastPathComponent ', cập nhật giao diện của tôi, v.v. thành phần đường dẫn bắt đầu 'purg-', ví dụ purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95.

    - (void) presentedItemDidMoveToURL:(NSURL *) newURL; 
    { 
        [super presentedItemDidMoveToURL: newURL]; 
    
        if ([(id)[self delegate] respondsToSelector:@selector(documentNameChanged:)]) 
        { 
         [[self delegate] documentNameChanged: self]; 
        } 
    } 
    
  • Phương pháp presentedItemDidMoveToURL: dường như không phải là nguyên nhân gốc rễ của sự cố. Ví dụ: nếu tôi không ghi đè phương thức đó, nhưng hãy kiểm tra định kỳ trong viewController đang xem xét tài liệu đang mở, sau đó đôi khi sau khi đổi tên fileURL sẽ trả lại tên mới và đôi khi nó sẽ trả về `purg -..... '. Vì vậy, vấn đề dường như liên quan đến cách đổi tên được xử lý.

Cập nhật

Như al_lea chỉ ra, vấn đề ở đây có liên quan đến accommodatePresentedItemDeletionWithCompletionHandler:. Mở rộng câu trả lời của al_lea, tôi đã thêm mã bên dưới vào lớp con UIDocument của mình. Điều này đã khắc phục được sự cố.

- (void) accommodatePresentedItemDeletionWithCompletionHandler: (void (^) (NSError *errorOrNil)) completionHandler 
    {  
     PresentedDocument* presentedDocument = [self retain]; 
     [presentedDocument closeWithCompletionHandler: ^(BOOL success) {   
      NSError* error = nil; 
      if (!success) 
      { 
       NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys: 
        @"Could not close document that is being deleted on another device", 
        NSLocalizedDescriptionKey, nil]; 
        error = [NSError errorWithDomain: @"some_suitable_domain" 
               code: 101 
              userInfo: userInfo]; 
      } 

     completionHandler(error); // run the passed in completion handler (required) 

     dispatch_async(dispatch_get_main_queue(),^
     { 
      [[NSNotificationCenter defaultCenter] postNotificationName: NOTIFY_presentedDocumentDeletedOnAnotherDevice 
                   object: presentedDocument 
                  userInfo: nil]; 

      [presentedDocument tidyUpAfterDelete]; // app specific tidy up 
      [presentedDocument release]; 
     }); 
    }]; 
} 

Với mã này tại chỗ, không có presentedItemDidMoveToURL giả mạo và khó hiểu: các cuộc gọi thực hiện và, ngoài ra, các đối tượng liên quan có thể nghe thông báo về xóa trên các thiết bị khác.

+0

Tôi đã cố gắng thực hiện công việc iCloud chỉ bằng DocumentState trong khoảng một tháng - đây là phần tôi đã bỏ lỡ. Trước khi thêm các mục mã này đôi khi sẽ trở lại sau khi xóa hoặc tôi sẽ nhận được luồng liên tục thay đổi trạng thái tài liệu –

Trả lời

6

Đây là loại URL sẽ xuất hiện khi một UIDocument được mở ra trên địa phương và được xóa từ một thiết bị điều khiển từ xa:

file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-

Bạn cần phải đóng tài liệu đầu tiên trước khi nó được xóa - phát hiện này trong NSFilePresenter của accommodatePresentedItemDeletionWithCompletionHandler: