2012-08-26 21 views
9

Realizzo un'app Cocoa basata su documenti in cui il documento è dinamico una raccolta di file (gli utenti possono aggiungere o rimuovere file). In particolare, le operazioni di salvataggio e apertura dovrebbero essere il più veloci possibile.Utilizzo di NSFileWrapper in NSDocument composto da vari file

Se ho letto correttamente la documentazione, dovrei usare NSFileWrapper e implementare fileWrapperOfType:error e readFromFileWrapper:ofType:error:. Tuttavia, non riesco a trovare un esempio di codice completo. Come dovrei implementare i seguenti metodi?

#pragma mark - NSDocument 

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError { 
    return nil; 
} 

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError **)outError { 
    return YES; 
} 

#pragma mark - My methods 

- (void) addFileToDocumentFromURL:(NSURL*)fileURL { 
    // Add a file to the document given the file URL 
} 

- (void) removeFileFromDocumentWithName:(NSString*)name { 
    // Remove a file from the document given the file name 
} 

risposta

10

Mettendo insieme bits e pieces dalla documentazione:

- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError { 
    return self.documentFileWrapper; 
} 

- (BOOL) readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError { 
    self.documentFileWrapper = fileWrapper; 
    return YES; 
} 

- (void) addFileToDocumentFromURL:(NSURL*)fileURL { 
    NSData* fileData = [NSData dataWithContentsOfURL:fileURL]; 
    NSFileWrapper *fileWrapper = [[NSFileWrapper alloc] initRegularFileWithContents:fileData]; 
    fileWrapper.preferredFilename = [fileURL lastPathComponent]; 
    [self.documentFileWrapper addFileWrapper:fileWrapper]; 
    [self updateChangeCount:NSChangeDone]; 
} 

- (void) removeFileFromDocumentWithName:(NSString*)name { 
    NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:name]; 
    if (fileWrapper) { 
     [self.documentFileWrapper removeFileWrapper:fileWrapper]; 
     [self updateChangeCount:NSChangeDone]; 
    } 
} 

- (NSFileWrapper*) documentFileWrapper { 
    if (!_documentFileWrapper) { // New document 
     _documentFileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil]; 
    } 
    return _documentFileWrapper; 
}