2009-08-12 36 views
0

我正在編寫一個小應用來跟蹤本地單點網站。我主要寫這爲我所用,並在Xcode從xcode在終端中運行代碼時發生無限循環

要開始我運行下面的代碼服務器玩:

[task setLaunchPath: @"/usr/bin/xsp2"]; 
NSArray *arguments = [NSArray arrayWithObjects: @"--root", [[document selectedSite] valueForKey:@"path"], @"--nonstop" ,nil]; 
[task setArguments: arguments]; 
NSLog(@"argument: %@", arguments); 

NSPipe *pipe = [NSPipe pipe]; 
[task setStandardOutput:pipe]; 

NSFileHandle *file = [pipe fileHandleForReading]; 

[task launch]; 

NSData *inData = nil; 
while ((inData = [file availableData]) && [inData length]) { 
    NSLog(@"%@", [[NSString alloc] initWithData:inData encoding:NSUTF8StringEncoding]); 
} 

[[document selectedSite] setValue:[NSNumber numberWithInt:1] forKey:@"active"]; 

[task release]; 
NSLog(@"opened site"); 

這將導致一個無限循環,因爲終端永不停止寫作(我猜?)。所以我的問題是,我如何停止循環?如果我不清楚,請發表評論。

回答

0

當你說「終端從不停止寫入(我猜?)」,是因爲輸出持續在終端或控制檯噴出?如果你沒有得到大量的輸出,可以撥打availableData塊 - 諮詢the documentation。你可以嘗試readDataToEndOfFile,看看它是否有幫助 - 你不應該把它放在一個循環中,除非它是一個非常大的文件(大於UINT_MAX字節)。

此外,意識到你(可能)與循環的每次迭代泄漏NSString。記住要在NSLog()調用中自動釋放字符串。

+0

感謝您抽出時間離開Quinn的答案,併爲泄漏提示:) 當我使用readDataToEndOfFile我的應用程序還扼流圈(旋轉比薩死亡輪)。 當我在終端上運行的代碼寫入文本 xsp2 聽力上地址的後續片段:0.0.0.0 Root目錄:/用戶/的Mads 偵聽端口:8080(非安全) 命中返回停止服務器。 – 2009-08-12 18:57:13

0

是的.. availableData將阻止你的情況,因爲沒有數據可用,但它尚未遇到文件結尾(如果服務器關閉了管道的末端,這可能會發生)。

一個解決方案只是聽另一個線程輸出。你的線程永遠不會關閉,但它也不會吃掉CPU。