我有以下代码:
- (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.
之前从未见过,谷歌也没有。有什么帮助吗?
答案 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];
}
这么简单......