2011-12-28 22 views
5

Problem: pracuję nad dokumentem iCloud na urządzeniu A, np. iPod Touch. Następnie zmieniam nazwę dokumentu na urządzeniu B, np. mój Mac (przez Finder). Zmiana przechodzi do chmury i po przerwie urządzenie A słyszy o tym.iCloud - czasami zmienianie nazwy otwartych dokumentów na innym urządzeniu

A potem:

  • jakiś czas wszystkim jest dobrze - mogę odebrać zmianę nazwy poprzez zmienił fileURL własności i może zaktualizować interfejs odpowiednio - dokument nadal zachowywać się tak jak powinien
  • przez pewien czas plikURUR pliku jest zwracany jako coś takiego: file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95 Nic dziwnego, że ten plik nie zostanie zapisany.

Czy ktoś może wyjaśnić, co się dzieje i jak go obejść?

Tło

  • Zmiana nazwy jest odbierany przez porządku przez NSMetadataQuery. Tak więc, na przykład, mogę zmieniać nazwy dokumentów, które nie są otwarte i cała moja funkcjonalność iCloud działa dobrze. Wydaje się, że problem dotyczy tylko otwartych dokumentów.

  • Inne funkcje iCloud działają poprawnie, np. Mogę zmienić treść na jednym urządzeniu, np. na moim Macu i wykryć, a następnie zaktualizować mój interfejs na innym urządzeniu, np. mój iPod Touch, który ma otwarty odpowiedni dokument iCloud.

  • Po raz pierwszy zauważyłem to po dodaniu nadpisania dla presentedItemDidMoveToURL: do mojej podklasy UIDocument. Nadpisanie niezawodnie zbiera zmiany nazw wprowadzone w chmurze, np. zmiana nazwy dokumentu na innym urządzeniu. Następnie czasami newURL jest końcowym oczekiwanym adresem URL dla dokumentu o zmienionej nazwie, tj. Coś sensownego, z którego mogę wyodrębnić nową nazwę, użyj `lastPathComponent ', zaktualizuj mój interfejs itp. Przy innych okazjach newURL jest dokumentem w innym katalogu z ostatnim element ścieżki rozpoczynający "purg-", np purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95.

    - (void) presentedItemDidMoveToURL:(NSURL *) newURL; 
    { 
        [super presentedItemDidMoveToURL: newURL]; 
    
        if ([(id)[self delegate] respondsToSelector:@selector(documentNameChanged:)]) 
        { 
         [[self delegate] documentNameChanged: self]; 
        } 
    } 
    
  • Sposób presentedItemDidMoveToURL: nie wydaje się być przyczyną problemu. Na przykład, jeśli w ogóle nie zastąpię tej metody, ale okresowo sprawdzam w kontrolerze viewController, który zajmuje się otwartym dokumentem, to popo zmianie nazwy fileURL po zmianie nazwy nazostanie zwrócona nowa nazwa, a , a następnie. ".". Wygląda więc na to, że problem dotyczy sposobu zmiany nazwy.

Aktualizacja

Jak al_lea podkreślił, chodzi tu wiązał się accommodatePresentedItemDeletionWithCompletionHandler:. Rozszerzając odpowiedź al_lea, dodałem poniższy kod do mojej podklasy UIDocument. To rozwiązało problem.

- (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]; 
     }); 
    }]; 
} 

Z tego kodu w miejscu, nie ma fałszywe i mylące presentedItemDidMoveToURL: Połączenia wykonane i, dodatkowo, właściwy obiekt może nasłuchiwać powiadomień o delecji w innych urządzeniach.

+0

Próbowałem sprawić, aby iCloud pracował przy użyciu tylko DocumentState przez około miesiąc - to był kawałek, którego mi brakowało. Przed dodaniem tego kodu elementy czasami zwracałyby się po usunięciu, lub pobierałbym ciągły strumień stale zmieniających się stanów dokumentu –

Odpowiedz

6

Ten rodzaj URL pojawia się, gdy UIDocument jest otwarty na lokalny i zostaną usunięte ze zdalnego urządzenia:

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

Trzeba zamknąć dokument najpierw, zanim zostaną usunięte - to wykryć w NSFilePresenter na accommodatePresentedItemDeletionWithCompletionHandler:

Powiązane problemy