Как обрабатывать несколько предупреждений одновременно - PullRequest
0 голосов
/ 17 мая 2019

У меня одновременно работает несколько nsnotificationcenters, которые при запуске выдают предупреждение. Иногда это приводит к срабатыванию более одного предупреждения за раз, но, конечно, вы можете отображать только одно, а другое не появляется. Как лучше всего справиться с этой ситуацией, чтобы несколько предупреждений могли идти подряд.

Мне надоело получать оповещения в одном методе, и когда показывается одно оповещение, поместите другое оповещение в массив, а затем пропустите этот массив, но это не работает должным образом. Я также пытался иметь предупреждения в отдельных методах, но это тоже не работает.

Я смотрел на использование семафоров, но не смог найти хороший пример.

Это мои уведомления, которые работают как положено. Я также искал несколько советов по уведомлениям. Где было бы лучшим местом для добавления наблюдателя, в viewDidAppear viewDidLoad. viewDidLoad выдает предупреждение всякий раз, когда отображается предупреждение, потому что оно хочет отображаться в представлении, которое не находится в иерархии.

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // * 26 APR 2019 * 1.0.4.0
    // Add observer for notifications
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"ROC" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"ROP" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"CARGO" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"PAX" object:nil];

}

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

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // * 26 APR 2019 * 1.0.4.0
    // Add observer for notifications
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"ROC" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"ROP" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"CARGO" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"PAX" object:nil];

}

- (void)receivedNotification:(NSNotification *)notification {
    NSMutableDictionary *msgData = [[FlightDataInput sharedFlightDataInput] dataForPage:4];
    NSMutableArray *alertArray = [[NSMutableArray alloc] init];

    if([self.presentedViewController isKindOfClass:[UIAlertController class]]) {
        [alertArray addObject:notification];
    }

    if(![self.presentedViewController isKindOfClass:[UIAlertController class]] && [alertArray count] == 0) {

        if([notification.name  isEqualToString: @"ROC"]) {

            UIAlertController *alertRoc = [UIAlertController alertControllerWithTitle:[msgData valueForKey:@"rocTitle"] message:[msgData valueForKey:@"rocMsg"] preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
                [alertRoc dismissViewControllerAnimated:YES completion:nil];
            }];

            [alertRoc addAction:ok];

            [self presentViewController:alertRoc animated:NO completion:nil];
        }
        if ([notification.name isEqualToString:@"ROP"]) {
            UIAlertController *alertRop = [UIAlertController alertControllerWithTitle:[msgData valueForKey:@"ropTitle"] message:[msgData valueForKey:@"ropMsg"] preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
                [alertRop dismissViewControllerAnimated:YES completion:nil];
            }];

            [alertRop addAction:ok];

            [self presentViewController:alertRop animated:NO completion:nil];
        }
        if ([notification.name isEqualToString:@"CARGO"]) {
            UIAlertController *alertCargo = [UIAlertController alertControllerWithTitle:[msgData valueForKey:@"cargoTitle"] message:[msgData valueForKey:@"cargoMsg"] preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
                [alertCargo dismissViewControllerAnimated:YES completion:nil];
            }];

            [alertCargo addAction:ok];

            [self presentViewController:alertCargo animated:NO completion:nil];
        }
        if ([notification.name isEqualToString:@"PAX"]) {
            UIAlertController *alertPax = [UIAlertController alertControllerWithTitle:[msgData valueForKey:@"paxTitle"] message:[msgData valueForKey:@"paxMsg"] preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
                [alertPax dismissViewControllerAnimated:YES completion:nil];
            }];

            [alertPax addAction:ok];

            [self presentViewController:alertPax animated:NO completion:nil];
        }
    }
    if([alertArray count] > 0) {
        for(int i = 0; i < [alertArray count]; i++) {
            // creating the same alerts in here if there are alerts in the array
        }
    }
}

У меня одновременно работает несколько nsnotificationcenters, которые при запуске выдают предупреждение. Иногда это приводит к срабатыванию более одного предупреждения за раз, но, конечно, вы можете отображать только одно, а другое не появляется. Как лучше всего справиться с этой ситуацией, чтобы несколько предупреждений могли идти подряд.

Мне надоело получать оповещения в одном методе, а когда показывается одно оповещение, поместить другое оповещение в массив, а затем запустить через этот массив, но это не работает должным образом. Я также пытался использовать предупреждения в отдельных методах, но это тоже не работает.

1 Ответ

2 голосов
/ 17 мая 2019

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

{
  NSMutableDictionary *msgData;
  NSMutableArray <NSNotification *> *alertArray;
  int alertIndex;
}

- (void)viewDidLoad:(BOOL)animated {
    [super viewDidLoad:animated];
    // * 26 APR 2019 * 1.0.4.0
    // Add observer for notifications

    msgData = [[FlightDataInput sharedFlightDataInput] dataForPage:4];
    alertArray = [NSMutableArray new];
    alertIndex = 0;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"ROC" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"ROP" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"CARGO" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"PAX" object:nil];
}

- (void)receivedNotification:(NSNotification *)notification {

      [alertArray addObject:notification];
        if(![self isAlertExist]) {
          [self checkAlerts];           
         }
}


-(void) checkAlerts
{
  if(alertIndex < [alertArray count])
  {
    NSNotification *notification = (NSNotification *)[alertArray objectAtIndex:arrayIndex];
    arrayIndex = arrayIndex + 1;

    if([notification.name  isEqualToString: @"ROC"]) {
                [self showAlertWithTitle:[msgData valueForKey:@"rocTitle"] andMessage:[msgData valueForKey:@"rocMsg"]];
        }
        else if ([notification.name isEqualToString:@"ROP"]) {
          [self showAlertWithTitle:[msgData valueForKey:@"ropTitle"] andMessage:[msgData valueForKey:@"ropMsg"]];
        }
      else if ([notification.name isEqualToString:@"CARGO"]) {
          [self showAlertWithTitle:[msgData valueForKey:@"cargoTitle"] andMessage:[msgData valueForKey:@"cargoMsg"]];
        }
        else if ([notification.name isEqualToString:@"PAX"]) {
            [self showAlertWithTitle:[msgData valueForKey:@"paxTitle"] andMessage:[msgData valueForKey:@"paxMsg"]];
        }
  }
}

-(void) showAlertWithTitle:(NSString *)title andMessage:(NSString *)message
{
  UIAlertController *alertPax = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
  UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
      [alertPax dismissViewControllerAnimated:YES completion:^{
        [self checkAlerts];
      }];
  }];

  [alertPax addAction:ok];
  [self presentViewController:alertPax animated:NO completion:nil];
}

-(BOOL) isAlertExist {
  for (UIWindow* window in [UIApplication sharedApplication].windows) {
     if ([window.rootViewController.presentedViewController isKindOfClass:[UIAlertController class]]) {
         return YES;
     }
 }
 return NO;
}
...