Alertview не вызывается при отсутствии доступа к Inte rnet - PullRequest
0 голосов
/ 08 января 2020

Используйте следующие стандартные вызовы для получения данных с сервера - и стандартное оповещение в случае ошибки - например, нет доступа к inte rnet. Если я выключаю сеть, приложение вылетает, никогда не нажимая на NSLog вызовы * ответа или * ошибки, никогда не входя в оповещение.

dispatch_queue_t concurrentQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//this will start the URL call and download in bg

dispatch_async(concurrentQueue, ^{

   NSURLSession *session = [NSURLSession sharedSession];
   NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.websitethatdownloadsdata.com"] completionHandler:^(NSData *myData, NSURLResponse *response, NSError *error) {

       NSLog(@"Resp value from NSURL task: %@", response);
       NSLog(@"Error value from NSURL task: %@", error);

       if (error == nil) {

       NSLog(@"Downloading data...");

       }

       if (error != nil) {

       UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Network Problem" message:@"Cannot download data" preferredStyle:UIAlertControllerStyleAlert];
         UIAlertAction * actionOK = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                            //Here Add Your Action
             abort();
                        }];

                    [alert addAction:actionOK];

       [self presentViewController:alert animated:YES completion:nil];

       }

1 Ответ

2 голосов
/ 08 января 2020

Фоновая очередь избыточна, потому что NSURLSession все равно распределяет свои задачи в фоновом потоке.

Но вы должны представить контроллер предупреждений в главном потоке

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.websitethatdownloadsdata.com"] completionHandler:^(NSData *myData, NSURLResponse *response, NSError *error) {

   NSLog(@"Resp value from NSURL task: %@", response);
   NSLog(@"Error value from NSURL task: %@", error);

   if (error == nil) {

      NSLog(@"Downloading data...");

   } else {
      UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Network Problem" message:@"Cannot download data" preferredStyle:UIAlertControllerStyleAlert];
      UIAlertAction * actionOK = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
         //Here Add Your Action
         abort();
      }];

      [alert addAction:actionOK];
      dispatch_async(dispatch_get_main_queue()) {
          [self presentViewController:alert animated:YES completion:nil];
      }
   }

}

И вы также должна отображаться причина ошибки в NSError экземпляре

...