2012-10-09 55 views
3

iOS 6中新的UIRefreshControl是一個值得歡迎的新功能,但似乎沒有內置的超時機制。需要實現UIRefreshControl的超時機制。

這裏的情景,爲什麼我需要它:

比方說,使用者將刷新。它進入紡紗模式,而代碼嘗試從服務器獲取數據。服務器不會響應,並且會導致紡輪永遠旋轉。所以,應該有一個超時機制來阻止它。

實現它的最佳方式是什麼?

回答

3

首先用您需要的時間量設置一個計時器。要求它檢查以下內容。

您可以使用下面的屬性來檢查它是否仍然清新的一段時間後

@屬性(非原子,只讀,吸氣= isRefreshing)BOOL刷新

如果是,那麼你可以使用

停止endRefreshing

喜歡的東西:

- (無效){checkAndStop
如果(refreshControl.refreshing == YES),如果你想
//顯示一個警告 [refreshControl endRefreshing]
}

+0

這是否有問題,但?如果您將計時器設置爲5秒鐘,該怎麼辦?用戶拉下UIRefreshControl(啓動計時器),並在2秒後正常結束。另外2秒鐘後,用戶再次拉下UIRefreshControl。 1秒鐘後,原來的計時器命中5秒,即使任務尚未完成,endRefreshing也會被調用。我誤解了什麼嗎? – Jschiff

1

我一直在使用的NSTimer結束清爽實施:

[NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(handleDataRefreshFailure:) userInfo:nil repeats:NO]; 
3

還要考慮使用dispatch_after,這可能是比創建的NSTimer耗材少。

int64_t delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    code to be executed on the main queue after delay 
}); 
0

斯威夫特版本:

let delayInSeconds: UInt64 = 2 
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * NSEC_PER_SEC)) 
dispatch_after(popTime, dispatch_get_main_queue(), { 
    if refreshControl.refreshing { 
     refreshControl.endRefreshing() 
    } 
    })