菜鸟教程小白 发表于 2022-12-13 17:21:55

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


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

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

<pre><code>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 = [initWithCString: testChar ];

      testLabel.text = tempString;

      ;

    });
});
</code></pre>

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

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

<p>所以我的 C 程序应该是这样的:</p>

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

      reportBackToUI( someResults ); // This is what I would LIKE to do
    }
}
</code></pre>

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

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

<p>感谢您的帮助。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>声明一个全局 c void*</p>

<pre><code>void* sipUACObj;
</code></pre>

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

<pre><code>sipUACObj = self;
</code></pre>

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

<pre><code>ObjcClass *obj = (ObjcClass*) sipUACObj;
;
</code></pre>

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

<p>您可以创建一个单例类并在其初始化时将其分配给 void 指针,然后在您的 C 函数中执行必要的操作。</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 从 iOS 中的 C 函数中更新 UI 线程,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/5951244/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/5951244/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 从 iOS 中的 C 函数中更新 UI 线程