Использование performSelector: withObject: afterDelay: с параметрами без объекта

Я хочу вызвать setEditing:animated: в виде таблицы с небольшой задержкой. Обычно я использовал бы performSelector:withObject:afterDelay:, но

  • pSwOaD принимает только один параметр
  • второй параметр setEditing:animated: - это примитивный BOOL - не объект

В прошлом я создавал бы фиктивный метод в своем классе, например setTableAnimated, а затем вызывал [self performSelector:@selector(setTableAnimated) withObject:nil afterDelay:0.1f, но для меня это было неприятно.

Есть ли лучший способ сделать это?

Ответ 1

Почему бы не использовать dispatch_queue?

  double delayInSeconds = 2.0;
  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
  dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
      [tableView setEditing …];
  });

Ответ 2

Вам нужно использовать NSInvocation:

Смотрите этот код, взятый из этого , и я немного изменил его в соответствии с вашим вопросом:

BOOL yes = YES;
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self.tableView methodSignatureForSelector:@selector(setEditing:Animated:)]];
[inv setSelector:@selector(setEditing:Animated:)];
[inv setTarget:self.tableView];
[inv setArgument:&yes atIndex:2]; //this is the editing BOOL (0 and 1 are explained in the link above)
[inv setArgument:&yes atIndex:3]; //this is the animated BOOL
[inv performSelector:@selector(invoke) withObject:nil afterDelay:0.1f];

Ответ 3

Селектор setEditing:animated: не совместим с performSelector:withObject:afterDelay. Вы можете вызывать только методы с 0 или 1 аргументами, а аргумент (если есть) ДОЛЖЕН быть объектом. Таким образом, ваше решение - путь. Вы можете обернуть значение BOOL в объект NSValue и передать его вашему методу setTableAnimated.

Ответ 4

Если вы можете обойти его, используйте захват NSInvocation для создания объекта вызова и вызовите его с задержкой с 1 строкой вместо многих: http://overooped.com/post/913725384/nsinvocation