如何在 Cordova 中创建基本的重复回调?

Posted

技术标签:

【中文标题】如何在 Cordova 中创建基本的重复回调?【英文标题】:How to create a basic repeating callback in Cordova? 【发布时间】:2016-04-17 10:17:24 【问题描述】:

我正在尝试制作一个非常简单的 cordova 插件来测试/演示重复回调。对我来说,重点是学习如何完成这些相对简单的任务,并获得对它们的信心。

android 上我正在这样做,而且效果很好:

public boolean execute(...

if ("repeat".equals(action)) 
    int count = args.getInt(0);
    int delay = args.getInt(1);
    String message = args.getString(2);

    this.repeat(count, delay, message, callbackContext);
    return true;

和我在同一个班

private void repeat(final int count, final int delay, final String message, final CallbackContext callbackContext) 
    new Thread(new Runnable() 
        public void run() 
            for (int i = 0 ; i < count ; i++) 
                if (i > 0)  // only delay after the first iteration. Had this been at the end of the method, we'd have had to do some extra math to keep track of the last iteration.
                    try 
                        Thread.sleep(delay);
                     catch (InterruptedException e) 
                        //
                    
                
                try 
                    JSONObject json = new JSONObject();
                    json.put("message", message);
                    json.put("count", (i+1));
                    json.put("time", System.currentTimeMillis());

                    PluginResult result = new PluginResult(PluginResult.Status.OK, json);
                    result.setKeepCallback(true);
                    callbackContext.sendPluginResult(result);
                 catch (JSONException e) 
                    PluginResult result = new PluginResult(PluginResult.Status.ERROR, "JSON Error: " + e.getMessage());
                    result.setKeepCallback(true);
                    callbackContext.sendPluginResult(result);
                
            

            callbackContext.success();
        
    ).start();

现在,要进行演示,我需要至少在 ios 上具有相同的功能,但也可能在 windows phone 上。

到目前为止,对于 iOS,我有这个,但是它只是立即吐出重复的消息,而且我没有 iPhone 可以测试。

- (void)repeat:(CDVInvokedUrlCommand*)command

    NSInteger count   = [[command.arguments objectAtIndex: 0] intValue];
    NSInteger delay   = [[command.arguments objectAtIndex: 1] intValue];
    NSString* message = [command.arguments objectAtIndex: 2];

    for (int i = 1; i <= count; i++)
    
        NSDictionary *payload = [NSDictionary dictionaryWithObjectsAndKeys:
            message, @"message", 
            @(i), @"count", 
            @"0", @"time", 
            nil];

        CDVPluginResult* pluginResult = nil;
        pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:payload];
        [pluginResult setKeepCallbackAsBool:YES];

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

    CDVPluginResult* pluginResult = nil;
    pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];

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

这是目前的测试插件:EventTest plugin source.

【问题讨论】:

你最后是怎么解决的? 我从来没有。 :( 【参考方案1】:

不清楚您在这里要求什么,但如果您尝试复制 Android 示例的行为,那么您只是错过了睡眠行为。 This question about delaying execution in Objective C 应该会有所帮助。

[NSThread sleepForTimeInterval: delay];

在您的 for 循环顶部应该足以阻止响应快速连续发回。不过,这会阻塞主应用程序线程,因此它不是最优雅的解决方案。

【讨论】:

以上是关于如何在 Cordova 中创建基本的重复回调?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Cordova 应用程序中创建 android.json?

如何在Flutter / Dart中创建异步回调?

如何在没有事件/委托回调的情况下在 Unity 中创建 MessageBox?

Cordova 应用程序 - 在 windows/mac 共享文件夹中创建文件

我可以通过 IOS 中的 phonegap/cordova 在 www 目录中创建一个文件夹吗?

如何在 Haxe 中创建动作脚本对象