[英]Is recurring method in background thread correct way in objective-c?
我正在嘗試以下代碼,我在后台線程中從服務器加載文件。 如果加載失敗然后再次調用相同的方法,這是在后台線程中再次調用它的正確方法嗎?
[self performSelectorInBackground:@selector(loadFileFromServer:) withObject:nil];
int retryCount = 0;
- (void)loadFileFromServer{
FetchServerFile *fetchF = [FetchServerFile new];
[fetchF fetchFile:^(BOOL OK){
if(OK){
[self toStart];
}
else{
retryCount++;
if(retryCount<3){
[self performSelectorInBackground:@selector(loadFileFromServer:) withObject:nil];
}
else{
[self exitLogic];
}
}
}];
}
關於performselectorinbackground:withObject:
的使用, 文檔告訴我們:
此方法在您的應用程序中創建一個新線程,如果尚未將您的應用程序置於多線程模式下。 由
aSelector
表示的方法必須像設置程序中的任何其他新線程一樣設置線程環境。 有關如何配置和運行線程的更多信息,請參閱線程編程指南。
如果您想在后台線程上運行一些代碼,使用Grand Central Dispatch會更容易(也更有效)。
話雖如此,它引出了一個問題,為什么你要把它推到后台線程。 網絡代碼通常異步運行,在這種情況下,在后台線程上運行此代碼沒有什么意義。 它只會使情況復雜化。
關於重試邏輯的細節,取決於目的。 一些應用程序使用“可達性”庫之一來主動警告用戶,如果他們沒有連接到網絡,但在這種情況下,你不會使用重試邏輯,而是你只需要一個處理程序重新建立網絡后調用。
似乎重試邏輯必須合並在請求的末尾(您正在檢查請求是否成功),而不是在您發起請求的開始。
此外,如果您只是嘗試執行一些簡單的上傳和下載,您可能需要考慮使用后台URLSessionConfiguration
,因為它可以處理各種各樣的問題(例如連接問題、用戶在上傳/下載完成之前離開應用程序等) .)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.