我正在使用一个 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-推荐答案 strong>
声明一个全局 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/
|