Сохранить контекст обратного вызова в плагине PhoneGap?

Мне нужно реализовать некоторые функции, которые запускают действие в интервале и возвращают результаты обратно в javascript.

Для упрощения я буду использовать пример эха из документации PhoneGap:

- (void)echo:(CDVInvokedUrlCommand*)command
{
  [self.commandDelegate runInBackground:^{

    CDVPluginResult* pluginResult = nil;
    NSString* echo = [command.arguments objectAtIndex:0];

    if (echo != nil && [echo length] > 0) {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
    } else {
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
    }

    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];

  }];
}

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

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

//Starts Timer
- (void)start:(CDVInvokedUrlCommand*)command
{
  [NSTimer scheduledTimerWithTimeInterval:1.0
                                  target:self
                                  selector:@selector(action:)
                                  userInfo:nil
                                  repeats:YES];
}

//Called Action
-(void)action:(CDVInvokedUrlCommand*)command
{
  [self.commandDelegate runInBackground:^{

    NSLog(@"TRIGGERED");

  }];
}

Любая помощь в сохранении этого в контексте обратного вызова была бы отличной. Спасибо!


person boom    schedule 12.09.2013    source источник


Ответы (3)


Вы хотите иметь что-то вроде:

NSString *myCallbackId;

как переменная уровня экземпляра (вне любого метода, поэтому она сохраняет свое значение). Установите его при первом входе в код плагина:

myCallbackId = command.callbackId;

Затем, сразу после создания экземпляра PluginResult, но перед его использованием, сделайте что-то вроде:

[pluginResult setKeepCallback:[NSNumber numberWithBool:YES]];

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

Затем сделайте что-то вроде:

[self.commandDelegate sendPluginResult:pluginResult callbackId:myCallbackId];
person Tony Hursh    schedule 23.10.2013
comment
Это хорошо (хотя я не являюсь разработчиком Objective C, но вы задокументировали свой код, поэтому я его немного понимаю). Мой вопрос в том, как после этого вы сможете справиться с этим в Javascript. В моей реализации (конечно, в Android) я получаю журнал консоли о secondCallback, поскольку я установил для параметра «setKeepCallback» значение true, и когда передается второй результат, я получаю этот журнал консоли. Итак, как с этим справиться. [1][ 2] - person Anas Azeem; 28.10.2013
comment
Я не знаю - я не пробовал это с Android. Если это работает, и единственная проблема - это сообщение журнала консоли, я бы просто проигнорировал его. :-) - person Tony Hursh; 28.10.2013
comment
Вовсе нет, @Tony, журнал не проблема. Это зеленый свет, что я что-то получаю, когда setKeepCallback id установлен на true. Меня беспокоит то, что я хочу обрабатывать эти «вторые обратные вызовы» в своем коде. Более того, вам не нужно беспокоиться об Android, достаточно javascript (или HTML) для их обработки. - person Anas Azeem; 28.10.2013

привет, чтобы получить много обратных вызовов для js, вы можете использовать setKeepCallback(true)

eg

 PluginResult p3=   new PluginResult(PluginResult.Status.OK, "0");
 p3.setKeepCallback(true);
person Arjun T Raj    schedule 12.09.2013
comment
Спасибо, не могли бы вы предоставить больше информации о том, как это работает? Я не совсем понимаю, как я могу реализовать это. - person boom; 12.09.2013
comment
Арджун Т Радж: Пожалуйста, ответьте на мои вопросы. Вопрос 1, Вопрос 2 - person Anas Azeem; 28.10.2013

Просто, если это кому-то поможет, в Android я не использую PluginResult, и я все еще могу сохранить ссылку на CallbackContext и вызвать его в любое время. Я не уверен, что это правильный путь, но я могу подтвердить, что это сработало для меня.

person Iker Jamardo Zugaza    schedule 08.07.2014