OGeek|极客世界-中国程序员成长平台

标题: objective-c - 从 iOS 中的 C 函数中更新 UI 线程 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 17:21
标题: objective-c - 从 iOS 中的 C 函数中更新 UI 线程

我正在使用一个 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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) Powered by Discuz! X3.4