2012-02-24 10 views
5

Już rzuciłem okiem na How do I create a global UIManagedDocument instance per document-on-disk shared by my whole application using blocks?, ale tak naprawdę nie rozumiem.Jak udostępnić jeden obiekt UIManagedDocument między różnymi obiektami?

Co chcę osiągnąć to to, że powinien istnieć tylko jeden UIManagedDocument - podstawowa baza danych - dla całej aplikacji. Różne obiekty powinny wywoływać metodę i uzyskać jedyny UIManagedDocument.

używam klasy pomocnika z metody klasy:

+ (UIManagedDocument *)getsharedDatabase:(NSString *)databaseName 
{ 
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:databaseName]; 
    // url is now "<Documents Directory>/<databaseName>" 

    if (![[NSFileManager defaultManager] fileExistsAtPath:[url absoluteString]]) 
    { 
     // does not exist on disk, so create one 
     UIManagedDocument *managedDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 

     return managedDocument; 
    } 
    else 
    { 
     UIManagedDocument *managedDocument = **?????** 

     return managedDocument; 
    } 
} 

Jak widać przez znaki zapytania, nie wiem jak dostać się istniejący plik. Sprawdziłem odwołanie do klasy UIManagedDocument, ale nie mogłem go znaleźć.

Czy możesz mi pomóc, proszę? Bardzo dziękuję z góry.

EDIT Zastanawiałem się ... co o metody singleton takich jak:

+ (UIManagedDocument *) sharedDatabase 
{ 
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"databaseName"]; 
    // url is now "<Documents Directory>/databaseName" 

    static UIManagedDocument *managedDocument = nil; 
    static dispatch_once_t mngddoc; 

    dispatch_once(&mngddoc, ^{ 
      managedDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
    }); 

    return managedDocument; 
} 
+0

Twój Singleton metoda wygląda droga. możesz przenieść kod tworzenia adresu URL do dispatch_once, aby go zoptymalizować. – Felix

+0

Wspaniale, dziękuję, aby dać kredyt tam, gdzie należy się kredyt: Colin Wheeler był moją inspiracją - http://stackoverflow.com/a/2200751/1096476 – uem

Odpowiedz

0

Jeśli istniejący UIManagedDocuments na dysku, trzeba przeszukać katalog dopasowywania plików. Zazwyczaj pliki miałyby pewien atrybut identyfikujący, jak zwykłe rozszerzenie pliku.

coś takiego:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSURL *appDirectoryURL = [appDelegate applicationDocumentsDirectory]; 
NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:appDirectoryURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:nil]; 

for (NSURL *fileURL in directoryContents) { 
    NSString *documentExtension = [fileURL pathExtension]; 

    if ([documentExtension isEqualToString:@"myfileextension"]) { 
    } 
} 
Powiązane problemy