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

SettingsReader是一个处理读取两个不同 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.

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

4

2 回答 2

1

我敢打赌,这意味着两个线程同时在 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 回答