вызовы функции гирляндной цепи (метод 1 вызывает метод 2, метод 2 вызывает метод 3) - PullRequest
1 голос
/ 03 августа 2011

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

-(void) select
{
  //do code
  [self drawMap];
}

-(void) drawMap
{
  //do code
  [self performSelector:@selector(showActionSheet) withObject:nil afterDelay:2];
}

-(void) showActionSheet
{
  //do code
}

Но функция showActionSheet не вызывается, она не запускается.

РЕДАКТИРОВАТЬ: но если я изменю

[self performSelector:@selector(showActionSheet) withObject:nil afterDelay:2]; 

до

[self showActionSheet];

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

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

Вы делаете это в потоке, который не имеет NSRunLopp , потому что именно NSRunLoop не только отвечает за обработку входных данных, но и отвечает за выполнение синхронизированных действий .

Также возможно, что у вас NSRunLoop нет возможности ждать ввода и запускать синхронизированные события, если у вас есть какой-то код, который выполняется в течение длительного времени, прежде чем вернуться к вашему NSRunLoop тогда ваш NSRunLoop не получит изменения, чтобы что-либо сделать до тех пор.

Другая возможность, если вы настроили NSRunLoop странным образом, вам, возможно, придется использовать

- [NSObject performSelector:(SEL)aSelector
                 withObject:(id)anArgument
                 afterDelay:(NSTimeInterval)delay
                    inModes:(NSArray *)modes];

вместо этого и попробуйте другой режим, отличный от режима по умолчанию для строки ( NSDefaultRunLoopMode ).

0 голосов
/ 03 августа 2011

Полагаю, вам нужно добавить параметр id в метод showActionSheet, чтобы метод performSelector:withObject:afterDelay работал правильно.

Попробуйте изменить подпись вашего метода на:

-(void) showActionSheet:(id) obj { ... }

И, добавив @ MByD , необходимо добавить двоеточие к вашему селектору:

[self performSelector:@selector(showActionSheet:) withObject:nil afterDelay:2]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...