1

私は次のコードを持っています:

- (void)readSettingsFiles
{
    NSOperationQueue *operationQueue = [[[NSOperationQueue alloc] init] autorelease];
    [operationQueue setName:@"File Parsing Queue"];

    if (urlForV1SettingsFile) {
        [operationQueue addOperationWithBlock:^{
            SettingsReader *settingsReader = [[[SettingsReader alloc] initWithURL:urlForV1SettingsFile] autorelease];
            NSArray *settings = [settingsReader settings];
            [settingsToSave addObjectsFromArray:settings];
        }];
    }

    if (urlForV2SettingsFile) {
        [operationQueue addOperationWithBlock:^{
            SettingsReader *settingsReader = [[[SettingsReader alloc] initWithURL:urlForV2SettingsFile] autorelease];
            NSArray *settings = [settingsReader settings];
            [settingsToSave addObjectsFromArray:settings];
        }];
    }

    while ([operationQueue operationCount] > 0) {
        sleep(1);
    }
}

SettingsReader2つの異なるXMLファイルの読み取りを処理するNSXMLParserデリゲートです。settingsToSaveこのメソッドが宣言されているクラスのプロパティであり、NSDictionaryと入力します。

私は睡眠を取っているので、すべてのファイルが解析されるまでメソッドは戻りません。

問題は、whileループを終了すると、コンソールで次のエラーが発生することです。

objc[74760]: Class _NSZombie_NSCFInputStream is implemented in both ?? and ??. One of the two will be used. Which one is undefined.

これまでに見たことがなく、Googleもありません。何か助けはありますか?

4

2 に答える 2

1

これは、2つのスレッドがNSInputStreamでゾンビ検出のマンギングダンスを同時に実行したことを意味していると思います。これらを並行して実行しなかった場合、これは起こらないと思います。私はそれについて心配しません。

于 2013-02-08T23:11:20.617 に答える
1

一つには、可変クラスはスレッドセーフではありません。したがって、最大同時実行数を1に設定する必要があります。

[operationQueue setMaxConcurrentOperationCount:1];

また

@synchronized(settingsToSave) {
    [settingsToSave addObjectsFromArray:settings];
}

また、変数名の設定をメソッド名の設定と同じにすることは、読みやすさのための最善のアイデアではない可能性があります。

さらに注目すべきは、なぜここでオペレーションキューを使用しているのですか?これらの操作はいずれも非同期ではありません。そして、とにかく完了するまでメインスレッドをブロックしている場合、NSOperationQueueとバックグラウンドスレッドを起動するすべてのオーバーヘッドにメリットはありません。なぜだけではないのですか?

if (urlForV1SettingsFile) {
        SettingsReader *settingsReader1 = [[[SettingsReader alloc] initWithURL:urlForV1SettingsFile] autorelease];
        NSArray *settings1 = [settingsReader1 settings];
        [settingsToSave addObjectsFromArray:settings1];
}

if (urlForV2SettingsFile) {
        SettingsReader *settingsReader2 = [[[SettingsReader alloc] initWithURL:urlForV2SettingsFile] autorelease];
        NSArray *settings2 = [settingsReader2 settings];
        [settingsToSave addObjectsFromArray:settings2];
}

とても簡単です...

于 2013-02-08T23:12:10.570 に答える