Objective C: изменение индекса контроллера панели вкладок через NSNotificationCenter вызывает проблемы

#ios #objective-c #ios7 #uitabbarcontroller #nsnotificationcenter

#iOS #objective-c #ios7 #uitabbarcontroller #nsnotificationcenter

Вопрос:

У меня есть табличное представление. когда выбрана определенная строка (кнопка выхода), выполняется проверка любой текущей синхронизации, происходящей между сервером и iPhone. Если он все еще синхронизируется, я использую наблюдателя в viewDidLoad, чтобы уведомить меня, когда он завершится. Затем наблюдатель вызывает logMeOut. Если синхронизация не выполняется, немедленно вызывается выход из системы.

Изменение индекса вкладки отлично работает при вызове в didSelectRowAtIndexPath . Но при вызове с сервера NSNotificationObserver я вижу, что обе вкладки с индексом 0 и 3 выделены синим цветом (что означает, что каким-то образом система выбрала индекс 0, но не смогла отменить индекс 3). Страница не изменяется; она по-прежнему отображает ту же страницу с индексом 3. Я не могу перейти к индексу 0, нажав на вкладку. Я должен нажать на один из индексов 1-3, а затем снова нажать на индекс 0, чтобы перейти туда.

Установка точек останова и операторы ведения журнала показывают, что NSNotificationCenter вызывается правильно. Я тестировал это как на iPhone, так и на Xcode Simulator.

// При вызове из наблюдателя скриншот ошибки

//при вызове из didselectrowatindexpath правильно

 - (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(logMeOut) //does not work when called here
     name:@"canLogOutNow"
     object:nil];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];

    if (indexPath.row == 0) {

        SyncEngine *syncengine = [SyncEngine sharedEngine];
        if (![syncengine syncInProgress]) {
            [self logMeOut];//works fine when called here
        } else {
            syncengine.needToLogOut = YES; //tells sync engine to call notification center
        }

    }

}

- (void)logMeOut {

    [PFUser logOut];

    [self.parentViewController.tabBarController setSelectedIndex:0]; //Current index is 3
}
  

// фрагмент syncengine.m

 if (self.needToLogOut) {
                NSNotification *notification = [NSNotification notificationWithName:@"canLogOutNow" object:nil];
                [[NSNotificationCenter defaultCenter] postNotification:notification];
            }
  

Комментарии:

1. Можете ли вы поделиться фрагментом, когда механизм синхронизации отправляет уведомление

2. Попробуйте установить точку останова в уведомлении и убедитесь, что вызов выполняется в основном потоке (поток 0). NSNotificationCenter отправляет уведомления в поток, из которого он был вызван, что, если это фоновый поток, не будет работать.

3. Привет, Райан, ты был прав. Я вызвал это в потоке 3. Спасибо!

4. Публикуете ли вы уведомление в основном потоке? Не уверен, что содержимое панели вкладок является потокобезопасным. Возможно, попробуйте опубликовать уведомление в основном потоке.