6

我需要实现一些功能来触发间隔上的操作并将结果发送回 javascript。

为了简化事情,我将使用 PhoneGap 文档中的 echo 示例:

- (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");

  }];
}

将其保留在回调上下文中的任何帮助都会很棒。谢谢!

4

3 回答 3

10

你会想要这样的东西:

NSString *myCallbackId;

作为实例级变量(在任何方法之外,因此它保留其值)。当你第一次进入插件代码时设置它:

myCallbackId = command.callbackId;

然后,在您实例化 PluginResult 之后,但在使用它之前,请执行以下操作:

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

这将告诉它保持回调有效以备将来使用。

然后执行以下操作:

[self.commandDelegate sendPluginResult:pluginResult callbackId:myCallbackId];
于 2013-10-23T18:04:03.717 回答
2

嗨,为了获得许多对 js 的回调,您可以使用setKeepCallback(true)

例如

 PluginResult p3=   new PluginResult(PluginResult.Status.OK, "0");
 p3.setKeepCallback(true);
于 2013-09-12T11:07:11.570 回答
0

只是如果它对某人有帮助,在 Android 中我没有使用 PluginResult 并且我仍然能够保留对 CallbackContext 的引用并随时调用它。我不确定这是否是正确的方法,但我可以确认它对我有用。

于 2014-07-08T02:52:34.713 回答