簡體   English   中英

objective-c 中后台線程中的重復方法是否正確?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM