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 nazwyfileURL
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.
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 –