请选择 进入手机版 | 继续访问电脑版
  • 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

objective-c - 从 iOS 中的 C 函数中更新 UI 线程

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

我正在使用一个 C 程序来尝试在我的 iOS 应用程序中使用它,并且尽可能少地进行修改。 C 程序对一组输入执行大量计算。

在 iOS 端,我使用以下代码来创建一个线程来运行计算,并且还有一种机制可以在计算完成时进行报告(目前,它会在完成时更新 UILabel os "testLabel"):

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    char *testChar = startProgram( nx, ny, nz ); // this is where I call the C program 

    dispatch_async(dispatch_get_main_queue(), ^{
        NSString *tempString = [[NSString alloc]initWithCString: testChar ];

        testLabel.text = tempString;

        [tempString release];

    });
});

这似乎可行,我得到了结果,并且我的 UI 保持响应。

但是,我希望在计算进行时从 C 例程与 UI 进行通信,以便获取状态以及以增量方式传回一些数据。

所以我的 C 程序应该是这样的:

char* startProgram( int nx, int ny, int nz )
{
    setupEverything(); // this is just pseudo code for clarity
    for( int i = 0; i < nz; i++ )
    {
        doMajorCalculations();

        reportBackToUI( someResults ); // This is what I would LIKE to do
    }
}

我在这里看到一个关于传递“self”的线程,但我认为如果通过上面的“self”将不会是我的类“self”。另外,我试过了,在 C 端得到了一个错误,说它不能识别类型“id”。我把“id”的类型改成类名,它告诉我参数错误。

关于实现这一点的最佳方法的任何想法?

感谢您的帮助。



Best Answer-推荐答案


声明一个全局 c void*

void* sipUACObj;

并在你的类初始化器中为它分配objective-c类对象

sipUACObj = self;

现在,当您需要从 C 函数调用某些内容时,请执行以下操作,

  ObjcClass *obj = (ObjcClass*) sipUACObj;
  [obj someMethod:arg1 Arg2:arg2];

这将调用相应的 Objective-C 函数,您可以在该函数中调用您的主 UI 线程。

您可以创建一个单例类并在其初始化时将其分配给 void 指针,然后在您的 C 函数中执行必要的操作。

关于objective-c - 从 iOS 中的 C 函数中更新 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951244/

回复

使用道具 举报

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

本版积分规则

关注0

粉丝0

帖子830918

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

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

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

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

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