2013-05-31 72 views
-1

無論如何,我可以出來的方法,無論該方法是否完全執行或不。我需要它只能跑4秒。無論如何要做到這一點?做一個方法只能運行一段時間

編輯:

如果我試圖檢查主機這需要太多的時間在檢查的可達性和平均同時,我真的想從可達性的反饋,以進一步我可以在此做什麼去了。 我想取消可達性檢查,如果它需要更多的4秒,我想繼續我的應用程序在離線模式下工作。我真的不希望我的用戶等待一段時間,直到我收到Reachabiltiy的反饋。

+0

請詳細說明您的需求檢查。我擔心它太普通了..它可以被關閉! – Devarshi

+0

感謝您澄清您的問題。請參閱我的[修改後的答案](http://stackoverflow.com/a/16851316/1271826),其中概述瞭如何使用通知和計時器的組合來實現所需的UX。 – Rob

回答

4

你已經更新了你的問題,以澄清你正在處理可達性。我可能會建議如下:

  1. 添加您的控制器作爲kReachabilityChangedNotification的觀察者,如圖Apple's Reachability code

  2. 創建Reachability對象,並開始通知:

    self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"]; 
    [self.hostReach startNotifier]; 
    
  3. 創建4秒NSTimer

  4. 提供用戶界面,指示您正嘗試與服務器建立連接。例如,您至少需要在界面前觀看一些視圖,以防止用戶與您的應用進行交互,並且您可能需要一個UIActivityViewIndicator,讓用戶知道該應用正在忙於做些什麼。

  5. 等待您的計時器關閉或Reachability通知觸發。

  6. 然後,您可以停止可達性通知程序,刪除您在步驟4中顯示的用戶界面,然後根據需要脫機或聯機進行操作。很明顯,如果你在定時器之前得到了Reachability通知器,你也可能想要你的四秒定時器。


原來的答覆:

您通常需要編寫這樣的事情自己,它取決於你的方法做了什麼。例如,對於NSURLConnection(您可以設置一個連接的cancel)的計時器,或者如果您有一個使用for循環的方法,您可以通過查看CFAbsoluteTimeGetCurrent()來檢查所用時間,一些較早的價值。我完全依賴於你的方法在做什麼。

另一種方法是將其發送到某個後臺線程,這樣,您可能不會太在意該方法的時間。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // do some time consuming process 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // all UI updates should be dispatched back to the main queue 
    }); 
}); 

此外,它完全取決於你想要做的。

2

你必須自己安排。在您長期運行的方法中,定期檢查「取消」標誌:

while (![context isCancelled] || workIsFinished) { 
    [self nextPartOfTimeConsumingWork]; 
} 

如果您發現已設置此標誌,請停止工作。然後,您可以在運行定時器的某些外部代碼中設置此標誌。

如果使用NSThreadNSOperationQueue併發,你會得到-cancel-isCancelled內置了這裏描述的做完全。

0

使用方法的一計時器...

NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 4.0 target: self 
            selector: @selector(myMethod:) userInfo: nil repeats: NO]; 

那麼4秒鐘後,你可以調用一個方法來處理離線模式。

在你想約4秒後結束加時賽的方法,你如果計時器無效使用

[NSTimer isValid] 
相關問題