【问题标题】:Keep callback context in PhoneGap plugin?在 PhoneGap 插件中保留回调上下文?
【发布时间】:2013-09-12 08:04:42
【问题描述】:

我需要实现一些功能来触发间隔上的操作并将结果发送回 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");

  }];
}

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

【问题讨论】:

    标签: cordova phonegap-plugins cordova-3


    【解决方案1】:

    你会想要这样的东西:

    NSString *myCallbackId;
    

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

    myCallbackId = command.callbackId;
    

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

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

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

    然后执行以下操作:

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

    【讨论】:

    • 这很好,(虽然我不是 Objective C 开发人员,但你已经记录了你的代码,所以我有点理解它)。我的问题是在这样做之后你将如何在 Javascript 中处理它。在我的实现中(当然是在 Android 中),我得到了一个关于 secondCallback 的控制台日志,因为我已经将“setKeepCallback”设置为 true,并且当第二个结果通过时,我得到了那个控制台日志。那么,如何处理这个问题。 [1][2]
    • 我不知道——我没有在 Android 上尝试过。如果它有效,并且唯一的问题是控制台日志消息,我会忽略它。 :-)
    • 完全不是@Tony,日志不是问题。当setKeepCallback id 设置为true 时,我得到了一些绿灯。我担心的是,我想在我的代码中处理那些“第二次回调”。此外,您不必担心 Android,只需 javascript(或 HTML)来处理它们。
    【解决方案2】:

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

    例如

     PluginResult p3=   new PluginResult(PluginResult.Status.OK, "0");
     p3.setKeepCallback(true);
    

    【讨论】:

    • 谢谢,您能否提供更多有关其工作原理的背景信息?我不太明白如何实现这一点。
    • Arjun T Raj:请回答我的问题。 Question 1, Question 2
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多