0

NSKeyedArchiver に問題があり、かなり長い間困惑しており、エラーを特定できないようです。

クラス「デバイス」のオブジェクトで構成される可変配列があります。私の appDelegate では、デバイスの mutableArray を保持しており、次の 3 つの機能があります。

- (void) loadDataFromDisk {
    self.devices = [NSKeyedUnarchiver unarchiveObjectWithFile: self.docPath];
    NSLog(@"Unarchiving");
}

- (void) saveDataToDisk {
    NSLog(@"Archiving");
    [NSKeyedArchiver archiveRootObject: self.devices toFile: self.docPath];
}

- (BOOL) createDataPath {
    if (docPath == nil) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
        NSString *docsDir = [paths objectAtIndex:0];
        self.docPath = [docsDir stringByAppendingPathComponent: @"devices.dat"];
        NSLog(@"Creating path");
    }

    NSLog(@"Checking path");

    NSError *error;
    BOOL success = [[NSFileManager defaultManager] createDirectoryAtPath: docPath withIntermediateDirectories: YES attributes: nil error:&error];
    if (!success) {
        NSLog(@"Error creating data path: %@", [error localizedDescription]);
    }
    return success;
}

アーカイブ解除プロセスから空の m​​utableArray を取得し続けます。私はARCを使用していますが、それが関係しているかどうかはわかりません。

4

1 に答える 1

2

どうやら、私が知らなかったのは、最初にルート オブジェクト (この場合は配列) を NSMutableDictionnary に保存する必要があるということでした。

NSMutableDictionary *rootObject;
rootObject = [NSMutableDictionary dictionary];

[rootObject setValue: self.devices forKey: @"devices"];

そして、rootObject を NSKeyedArchiver で保存します。奇妙なことに、これはどのチュートリアルでも見られませんでした。

したがって、データを NSKeyedArchiver にロードおよび保存するための次の関数になります。

- (void) loadArrayFromArchiver {
    NSMutableDictionary *rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile: [self getDataPath]];

    if ([rootObject valueForKey: @"devices"]) {
        self.devices = [rootObject valueForKey: @"devices"];
    }

    NSLog(@"Unarchiving");
}

- (void) saveArrayToArchiver {
    NSLog(@"Archiving");

    NSMutableDictionary *rootObject = [NSMutableDictionary dictionary];

    [rootObject setValue: self.devices forKey: @"devices"];

    [NSKeyedArchiver archiveRootObject: rootObject toFile: [self getDataPath]];
}

- (NSString *) getDataPath {
    self.path = @"~/data";
    path = [path stringByExpandingTildeInPath];
    NSLog(@"Creating path");
}
于 2013-09-23T08:36:40.533 に答える