#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. Публикуете ли вы уведомление в основном потоке? Не уверен, что содержимое панели вкладок является потокобезопасным. Возможно, попробуйте опубликовать уведомление в основном потоке.