NSOperationQueue非常奇怪的错误

时间:2013-02-08 22:49:49

标签: objective-c macos cocoa nsoperationqueue

我有以下代码:

- (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);
    }
}

SettingsReader是一个NSXMLParser委托,用于处理读取两个不同的XML文件。 settingsToSave是声明此方法的类的属性,键入NSDictionary。

我有睡眠,所以在解析完所有文件之前,该方法不会返回。

问题是,当我退出while循环时,我在控制台中收到此错误:

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

之前从未见过,谷歌也没有。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

我认为这意味着两个线程同时在NSInputStream上进行了僵尸检测。我怀疑如果你没有并行执行这些,这不会发生。我不担心。

答案 1 :(得分:1)

首先,可变类不是线程安全的。所以你应该将max concurrent设置为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];
}

这么简单......