Является ли повторяющийся метод в фоновом потоке правильным способом в target- c? - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь следующий код, где я загружаю файл с сервера в фоновом потоке. И если это не удалось загрузить, то снова вызывая тот же метод, это правильный способ вызвать его снова в фоновом потоке?

[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];
         }
      }
     }];
}

1 Ответ

0 голосов
/ 08 апреля 2020

Относительно использования performselectorinbackground:withObject:, документация сообщает нам:

Этот метод создает новый поток в вашем приложении, переводя ваше приложение в многопоточный режим, если оно было нет уже Метод, представленный aSelector, должен настроить среду потока так же, как и для любого другого нового потока в вашей программе. Для получения дополнительной информации о настройке и запуске потоков см. Руководство по программированию потоков .

Намного проще (и эффективнее) просто использовать Grand Central Dispatch если вы хотите запустить какой-либо код в фоновом потоке.

При этом возникает вопрос, почему вы вообще выдвигаете это в фоновый поток. Сетевой код обычно выполняется асинхронно, и в этом случае нет смысла запускать этот код в фоновом потоке. Это только усложнит ситуацию.

Относительно особенностей лога повторов c, это зависит от цели. Некоторые приложения используют одну из библиотек «достижимости», чтобы заранее предупредить пользователя, если он не подключен к сети, но в этом случае вы не будете использовать retry logi c как таковые, а просто будете иметь обработчик, который вызывается после восстановления сети.

Похоже также, что logry c повторных попыток должен быть включен в конце запроса (где вы проверяете, был ли запрос успешным ), а не в самом начале, где вы инициируете запрос.

Кроме того, если вы просто пытаетесь выполнить несколько простых загрузок и загрузок, вы можете рассмотреть возможность использования фона URLSessionConfiguration, так как он обрабатывает целый ряд проблем (например, проблемы с подключением, пользователь покидает приложение до завершения загрузки / скачивания и т. д. c.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...