2011-12-02 7 views
11

Mam sporo kłopotów rozszyfrowania Apple's documentation around UIManagedDocument, w szczególności następujące metody:Jak zapisać dodatkową zawartość do moich pakietów plików UIManagedDocument?

  • - (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error

Czy ktoś z powodzeniem udało się uratować dodatkową zawartość do " katalog zawartości dodatku w swoich pakietach UIManagedDocument? Chcę zapisać proste obrazy (pliki PNG, JPEG itp.) I wideo (m4v, itp.) Do tego katalogu, wykorzystując identyfikatory UUID jako nazwy plików (z poprawnym rozszerzeniem pliku) i przechowując odniesienia do tych pojedynczych plików jako ścieżki plików w ciągu NSString mój uporczywy sklep.

+0

Czy miałeś w tym trochę szczęścia? Zajmuję się tym samym. –

Odpowiedz

12

Kredyt trafia do Apple DTS za pomoc w zrozumieniu tej klasy. Dzielę się niektórymi przykładami, z którymi mi pomogli (nieco zmodyfikowanymi).

OK, więc w zasadzie to działa tak: podklasy UIManagedDocument i wdrożenie następujących metod (gdzie właściwość extraInfo jest tylko NSDictionary realizowanych na naszej podklasy):

- (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error 
{ 
    NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"]; 
    self.extraInfo = [NSDictionary dictionaryWithContentsOfURL:myURL]; 
    return YES; 
} 

- (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error 
{ 
    if (!self.extraInfo) { 
     return [NSDictionary dictionaryWithObjectsAndKeys: @"Picard", @"Captain", [[NSDate date] description], @"RightNow", nil]; 
    } else { 
     NSMutableDictionary *updatedFriendInfo = [self.extraInfo mutableCopy]; 
     [updatedFriendInfo setObject:[[NSDate date] description] forKey:@"RightNow"]; 
     [updatedFriendInfo setObject:@"YES" forKey:@"Updated"]; 

     return updatedFriendInfo; 
    } 
} 

- (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error 
{ 
    if (content) { 
     NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"]; 
     [(NSDictionary *)content writeToURL:myURL atomically:NO]; 
    } 

    return YES; 
} 

UIManagedDocument wezwie tych metod, gdy to musi automatycznie zapisywać wszystko, co potrzebne do zapisania w pakiecie dokumentów w katalogu AdditionalContent.

Jeśli trzeba wymusić zapisać, wystarczy zadzwonić na następujący przykład UIManagedDocument:

[self updateChangeCount:UIDocumentChangeDone]; 

Obecnie nie używam tego dla zdjęć i filmów - ale przykład powinny dać ci wystarczy wyruszać.

+0

Świetnie, dzięki za to! Jedyne, czego nie jestem pewien, to obsługa plików (na przykład zdjęć, plików mp3 itp.), Które zostaną dołączone do dokumentu. Czy to wszystko odbywa się ręcznie, koordynując dostęp do pliku do dodatkowego katalogu zawartości w otoku pliku dokumentu? –

+1

Tak więc w zasadzie zamierzałem sobie z tym poradzić, aby odczytywać NSURL arbitralnych plików w tablicy dołączonej do podklasy UIManagedDocument. Gdy wywoływana jest metoda 'readAdditionalContentFromURL: error:', pobierz listę adresów URL na dysku i zapisz ją.Prawdopodobnie będziesz musiał skojarzyć jakąś formę pamięci podręcznej z podklasą, którą przepłukano za każdym razem, gdy 'writeAdditionalContent: toURL: originalContentsURL: error:' jest wywoływane, aby faktycznie zapisywać pliki photos/mp3/et al na dysku. Możesz zdecydować się na przechowywanie plików w katalogu tymczasowym, dopóki nie pojawi się spłukiwanie. –

+1

Nie mogłem tego zrobić w bardzo czysty sposób, więc biorąc pod uwagę, że jestem ukierunkowany na system iOS 5 i wyższy, włączyłem zewnętrzne przechowywanie właściwości binarnych w moim magazynie danych podstawowych, a ja przesuwałbym obrazy i filmy do mojej trwałej przechowywać zamiast dodatkowego katalogu zawartości. Do tej pory był to rozsądny kompromis i nie widziałem żadnych problemów z działaniem lub zachowaniem (wiem, że inni mają do czynienia z pamięcią zewnętrzną). Niestety, nie jest to idealna odpowiedź, ale jak wiele API dodanych do iCloud, nie sądzę, że Apple zakończyło dokumentowanie^H^H^H^H^H^H^H^H^H^H oni. –

3

Dokumentacja dla -additionalContentForURL: error: wskazuje, że zwrócenie zero ma zasygnalizować błąd.

A return value of nil indicates an error condition. To avoid generating 
    an exception, you must return a value from this method. If it is not always 
    the case that there will be additional content, you should return a sentinel value (for example, an NSNull instance) that you check for in 
    writeAdditionalContent:toURL:originalContentsURL:error:. 

zastąpić -writeContents:andAttributes:safelyToURL:forSaveOperation:error: w innym celu (robi kilka rzeczy na pierwszy Zapisz nowego dokumentu), a nazywając Super powołuje bogów NSException ponieważ contents wartość jest zerowa, a nie NSDictionary jako pozornie oczekiwaniami UIManagedDocument. Hmm.

Im więcej wiesz ...

P.S. Myślę, że to zależy od pory dnia z -writeContents: andAttributes: ... Raz rzuciłem wyjątek narzekający na oczekiwanie NSDictionary, ale później wyrzuciłem wyjątek narzekając, że nie przekazałem go NSData. Moje brwi nie mogły zostać podniesione bardziej w stylu Spocka niż teraz.

Powiązane problemy