2012-08-07 71 views
0

我目前在Mac OS X應用程序中使用蘋果公司的SimplePing在傳輸數據之前ping一個URL,這工作正常,但鎖定我的用戶界面。我可能沒有在正確的地方尋找,但我怎樣才能避免這種情況發生?我目前正在使用currentRunLoop,我認爲這是問題所在,但我仍然希望用戶能夠在此操作期間與UI進行交互(例如取消)。如何爲Simple Ping創建運行循環,以便我的UI不鎖定?NSThread與代表SimplePing

SimplePing *localPing = [SimplePing simplePingWithHostName:pingHost]; 
     [localPing setDelegate:self]; 
     [localPing start]; 

     do { 
      [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
     } while (localPing != nil); 

回答

0

使用SimplePing時,您的UI被鎖定的原因是因爲ping實用程序需要一定的時間來完成。而且你似乎在你的主線程中這樣做,導致鎖定UI界面白色的ping任務正在進行。 所以,你可以使用下面的代碼

-(void) ping:(NSString *) ip 
{ 
SimplePing *localPing = [SimplePing simplePingWithHostName:pingHost]; 
[localPing setDelegate:self]; 
[localPing start]; 
} 

,然後調用ping功能在新的線程像

[NSThread detachNewThreadSelector:@selector(ping:) toTarget:self. withObject:@"IP Address"]; 
+1

這似乎解決了用戶界面死機的問題,但我從未似乎得到委託的回調,所以我的應用程序從未完成。任何想法爲什麼這可能是/如何解決它?我在你的答案中改變的唯一的東西是添加一個autoreleasepool,並在'ping:'中將'ip'改爲'pingHost',並在'detachNewThreadSelector: – Katie 2012-08-08 15:33:25