Domanda

Ho uno strumento che scrive i documenti pacchetto di stile. E 'implementato usando NSDocument e sovrascrive i seguenti metodi NSDocument:

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
                              error:(NSError **)outError;

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

Questo è tutto molto bello, tranne quando ho salvare un documento che è sotto il controllo di versione. (Le directory .svn non vengono mantenuti, ecc.)

C'è una qualche buona ricetta per fare i miei documenti giocare bene con svn?

È stato utile?

Soluzione

sto cercando di indovinare il codice funziona creando un file fresco involucro ogni -fileWrapperOfType:error: volta che viene chiamato. Questo è comodo, ma con deroghe eventuali file aggiuntivi che possono esistere sul disco all'interno della confezione.

Così, invece, che cosa succede se si inizia con la creazione / usando un wrapper di file che si riferisce ai contenuti presenti sul disco. Modificare che wrapper per corrispondere stato attuale del documento, e restituire il risultato. Quando questo involucro viene scritto su disco, i file svn devono essere adeguatamente mantenuti.

Altri suggerimenti

Ecco la mia soluzione basata sulla risposta di Mike!

I miei pacchetti di documenti sono fasci, con la solita struttura gerarchica ... Quindi ci sono quattro directory che mutano durante la salva:

  1. Il salvataggio crea un nuovo top-level (My.bundle)
  2. La directory di contenuto viene modificato (My.bundle / Contents)
  3. La directory delle risorse viene modificata (My.bundle / Contents / Resources)
  4. Le risorse localizzate vengono aggiornati (My.bundle / Contents / Resources / en.lproj)

La ricetta inizia con l'aggiunta di uno slot dizionario mutabile alla classe di documento per preservare il contenuto di ciascuna di queste directory.

@interface LMDocument : NSDocument {
@private
    // All this is for preserving SCM artifacts across saves…
    NSMutableDictionary * bundleWrappers;
    NSMutableDictionary * contentsWrappers;
    NSMutableDictionary * resourcesWrappers;
    NSMutableDictionary * localizedWrappers;
}

Quando si crea un nuovo documento, questi iniziano come dizionari vuote.

- (id)init;
{
    if ((self = [super init]) != nil) {
        bundleWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        contentsWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        resourcesWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        localizedWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
    }
    return self;
}

Quando si legge in un documento esistente, sostituire questi con copie mutevoli dei contenuti fileWrapper rilevanti.

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
                     ofType:(NSString *)typeName
                      error:(NSError **)outError;
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    bundleWrappers = [[fileWrapper fileWrappers] mutableCopy];
    contentsWrappers = [[[bundleWrappers objectForKey:@"Contents"] fileWrappers] mutableCopy];
    resourcesWrappers = [[[contentsWrappers objectForKey:@"Resources"] fileWrappers] mutableCopy];
    localizedWrappers = [[[resourcesWrappers objectForKey:@"en.lproj"] fileWrappers] mutableCopy];
    NSFileWrapper * infoPlistWrapper = [contentsWrappers objectForKey:@"Info.plist"];
    [contentsWrappers removeObjectForKey:@"Info.plist"]; // Replaced during save…
    // …
    NSMutableDictionary * localizedWrappersCopy = [localizedWrappers mutableCopy];
    [localizedWrappers enumerateKeysAndObjectsUsingBlock:^(id key,
                                                           id obj,
                                                           BOOL * stop)
     {
         if (mumble) { // If it's a file that will be replaced during save…
             [localizedWrappersCopy removeObjectForKey:key]; // Replaced during save…
             // …
         }
     }];
    localizedWrappers = localizedWrappersCopy;
    [pool drain];
    return YES;
}

e , infine, , quando si salva un documento uso dei dizionari tanto faticosamente preparato.

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
                               error:(NSError **)outError;
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSFileWrapper * localizedWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:localizedWrappers];
    [resourcesWrappers setObject:localizedWrapper
                          forKey:@"en.lproj"];
    NSFileWrapper * resourcesWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:resourcesWrappers];
    [contentsWrappers setObject:resourcesWrapper
                         forKey:@"Resources"];
    NSFileWrapper * contentsWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:contentsWrappers];
    // …
    for (id item in mumble) {
        NSString * filename = [item filename];
        NSData * data = [item data];
        [localizedWrapper addRegularFileWithContents:data
                                   preferredFilename:filename];
    }
    [contentsWrapper addRegularFileWithContents:[self infoPlistData]
                              preferredFilename:@"Info.plist"];
    [pool drain];
    [bundleWrappers setObject:contentsWrapper
                       forKey:@"Contents"];
    NSFileWrapper * bundleWrapper =
    [[[NSFileWrapper alloc] initDirectoryWithFileWrappers:bundleWrappers] autorelease];
    return bundleWrapper;
}

Ora, quando un documento viene modificato il pacchetto, l'applicazione conserva tutti i file che non hanno aggiunto al fascio, tra cui manufatti SCM e "altri" localizzazioni!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top