Phonegap"['Media']插件应该使用后台线程."

Mul*_*att 6 media plugins multithreading background cordova

我正在使用Phonegap 3和Media插件.在iOS上测试我的应用时,我一直收到这些错误:

THREAD WARNING: ['Media'] took '205.391846' ms. Plugin should use a background thread.
Run Code Online (Sandbox Code Playgroud)

我从phonegap文档(http://docs.phonegap.com/en/edge/guide_platforms_ios_plugin.md.html)中看到了这一点:

   - (void)myPluginMethod:(CDVInvokedUrlCommand*)command
{
    // Check command.arguments here.
    [self.commandDelegate runInBackground:^{
        NSString* payload = nil;
        // Some blocking logic...
        CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload];
        // The sendPluginResult method is thread-safe.
        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    }];
}
Run Code Online (Sandbox Code Playgroud)

这是否会进入我的应用程序,或者我是否需要为每个插件编辑它?我把它放在哪里?

我在网上看到了一些关于此的帖子,但没有一个明确回答如何使用上述代码.

ben*_*nka 11

就个人而言,我还没有使用Media插件,但要处理后台线程,你需要检查哪个调用导致了warning.

例如,如果在创建media对象时抛出此警告:

var my_media = new Media(src, onSuccess, onError);
Run Code Online (Sandbox Code Playgroud)

然后你可以检查插件.js文件(这是Media.js).查找函数Media并查找本机调用,在这种情况下:

exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
Run Code Online (Sandbox Code Playgroud)

由此你知道这是调用Media类的create方法.
所以去打开Media.m(或CDVSound.m在这个确切的情况下)并寻找create方法(你应该找到它cordova/plugins/org.apache.cordova.media/src/ios),结束封装整个方法:

[self.commandDelegate runInBackground:^{
    // the create method goes here
}]; 
Run Code Online (Sandbox Code Playgroud)

这将为"本机"媒体创建创建后台线程.它应该如下所示:

- (void)create:(CDVInvokedUrlCommand*)command
{
    [self.commandDelegate runInBackground:^{
        NSString* mediaId = [command.arguments objectAtIndex:0];
        NSString* resourcePath = [command.arguments objectAtIndex:1];

        CDVAudioFile* audioFile = [self audioFileForResource:resourcePath withId:mediaId doValidation:NO forRecording:NO];

        if (audioFile == nil) {
            NSString* errorMessage = [NSString stringWithFormat:@"Failed to initialize Media file with path %@", resourcePath];
            NSString* jsString = [NSString stringWithFormat:@"%@(\"%@\",%d,%@);", @"cordova.require('org.apache.cordova.media.Media').onStatus", mediaId, MEDIA_ERROR, [self createMediaErrorWithCode:MEDIA_ERR_ABORTED message:errorMessage]];
            [self.commandDelegate evalJs:jsString];
        } else {
            CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
            [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你这个非常明确,详细的回复!但问题是......这是必要的吗?Xcode为任何花费超过10毫秒的插件调用提供此警告,这不是很长(我认为用户不会注意到<100毫秒的延迟).我可以安全地忽略此警告,或者此警告会导致Apple拒绝我的应用程序吗? (2认同)
  • @mattstuehler,这有时在代码花费比预期更长的时间或只是冻结UI时是必要的。 (2认同)