2013-02-08 57 views
1

很奇怪的錯誤,我有以下代碼:與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. 

之前從來沒有見過它,既沒有谷歌。任何幫助?

+0

爲了澄清,這是察覺殭屍構建?無關,我不明白你爲什麼使用'NSOperationQueue',如果你反正等着它。另外,'settingsToSave'是一個成員變量? – 2013-02-08 23:00:01

+3

你不應該同時從多個線程更新'settingsToSave'數組,這是行不通的。另外,使用'waitUntilAllOperationsAreFinished'而不是'sleep'循環。 – Sven 2013-02-08 23:01:32

+0

您是否使用類別? – 2013-02-08 23:09:13

回答

1

我敢打賭,這意味着兩個線程同時在NSInputStream上完成了殭屍檢測摧毀舞蹈。我懷疑如果你沒有平行執行這些,這不會發生。我不會爲此擔心。

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

所以要簡單得多......