Использование NSFileWrapper в NSDocument из разных файлов
Я делаю основанное на документе приложение Какао, в котором документ представляет собой динамический набор файлов (пользователи могут добавлять или удалять файлы). В частности, операции сохранения и открытия должны быть максимально быстрыми.
Если я правильно понимаю документацию, я должен использовать NSFileWrapper
и реализовать fileWrapperOfType:error
а также readFromFileWrapper:ofType:error:
, Тем не менее, я не могу найти полный пример кода. Как я должен реализовать следующие методы?
#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
}
1 ответ
Решение
Собираем кусочки из документации:
- (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;
}