• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 来自实例方法的具有静态 void 的 Objective C Cordova 回调

[复制链接]
菜鸟教程小白 发表于 2022-12-13 04:01:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在构建一个可以执行 DNS 查询的 Cordova 插件。由于操作是异步的,我需要使用回调来返回值。

我有

#import <dns_sd.h>

....

- (void)dnsQueryCDVInvokedUrlCommand*)command
{
    id domain = [command.arguments objectAtIndex:0];

    DNSServiceRef serviceRef;

    DNSServiceQueryRecord(&serviceRef, 0, 0, "hmspl.de", kDNSServiceType_TXT,
                      kDNSServiceClass_IN, queryCallback, command);

    DNSServiceProcessResult(serviceRef);
    DNSServiceRefDeallocate(serviceRef);
}

然后是回调,也就是一个static void:

static void queryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
                      DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype,
                      uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) {

if (errorCode == kDNSServiceErr_NoError && rdlen > 1) {
    NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen];

    for (uint16_t i = 1; i < rdlen; i += 256) {
        [txtData appendBytes:rdata + i length:MIN(rdlen - i, 255)];
    }

    NSString *theTXT = [[NSString alloc] initWithBytes:txtData.bytes length:txtData.length encoding:NSASCIIStringEncoding];
    NSLog(@"%@",    

    //PROBLEM HERE
    [self.commandDelegate sendPluginResult:theTXT callbackId:context.callbackId]; 
   }
}

@end

我需要用初始方法返回一个回调:

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

但我不能在 static void 方法中使用 self

如何将值 theTXT 返回到 cordova 并将 command.callbackId 从原始方法传递给回调?



Best Answer-推荐答案


DNSServiceQueryRecord的最后一个参数是应用上下文,而不是传递cordova的命令,而是传递self作为参数

在您的 .h 中

@property (strong, nonatomic) NSString * callbackId;

在你的 .m 中

- (void)dnsQueryCDVInvokedUrlCommand*)command
{
    self.callbackId = command.callbackId;

    id domain = [command.arguments objectAtIndex:0];

    DNSServiceRef serviceRef;

    DNSServiceQueryRecord(&serviceRef, 0, 0, "hmspl.de", kDNSServiceType_TXT,
                          kDNSServiceClass_IN, queryCallback, (__bridge void*)self);

    DNSServiceProcessResult(serviceRef);
    DNSServiceRefDeallocate(serviceRef);
}

所以你现在可以在 queryCallback 中使用它

static void queryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
                      DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype,
                      uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) {

if (errorCode == kDNSServiceErr_NoError && rdlen > 1) {
    NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen];

    for (uint16_t i = 1; i < rdlen; i += 256) {
        [txtData appendBytes:rdata + i length:MIN(rdlen - i, 255)];
    }

    NSString *theTXT = [[NSString alloc] initWithBytes:txtData.bytes length:txtData.length encoding:NSASCIIStringEncoding];
    NSLog(@"%@",    

    [context.commandDelegate sendPluginResult:theTXT callbackId:context.callbackId]; 
   }
}

关于ios - 来自实例方法的具有静态 void 的 Objective C Cordova 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27520992/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap