2011-05-10 197 views
2

我正在使用C程序嘗試在iOS應用程序中使用它,並儘可能少地進行修改。 C程序對一組輸入執行大量計算。從iOS中的C函數更新UI線程

在iOS端,我使用下面的代碼來創建一個線程來運行計算,並且還有一個機制來報告它什麼時候完成(目前,它完成時會更新一個UILabel操作系統「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]; 

    }); 
}); 

這似乎工作,我得到我的結果,我的用戶界面保持響應。

但是,我想從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 
    } 
} 

只見這裏一個線程關於通過「自我」,但我不認爲「自我」,如果通過以上將是我的班「自」。另外,我嘗試了這些,並在事物的C端發生了錯誤,並說它沒有識別「id」類型。我將「id」的類型更改爲類名稱,並告訴我參數錯誤。

有關實現此目的的最佳方法的任何想法?

謝謝你的幫助。

回答

2

也許你想要的是有一個塊作爲回調部分結果回報給調用者。事情是這樣的:

char* startProgram(int nx, int ny, int nz, void(^reportBackToUI)(int)) 
{ 
    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 
    } 
} 

然後客戶端可以使用類似呼叫startProgram

return startProgram(42, 12, 20, ^(int someResults) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // Update UI in some way. 
      });   
     }); 

這樣,你的代碼將有什麼,或者如何在客戶端做並使用進度回調不存在依賴關係。這也是很好的依賴注入。

如果使用塊是不可能的(模型代碼可能需要純C才能在其他平臺上工作?)然後您可以切換功能指針塊。

+0

剛剛注意到塊中的dispatch_async,應該可以工作。不抱歉的道歉。 – davydotcom 2011-05-10 19:18:50

+0

@davydotcom:這就是爲什麼我有dispatch_async(dispatch_get_main_queue(),^ {...'在如何使用回調的例子中,這是在主線程上運行代碼的魔力果汁 – PeyloW 2011-05-10 19:32:14

+0

工作!謝謝你的幫幫我。 – 2011-05-11 12:58:01

3

聲明一個全局C無效*

void* sipUACObj; 

,併爲其分配的Objective-C類對象的類初始化

sipUACObj = self; 

現在只要您需要調用從C函數的東西做以下,

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

這會調用相應的objective-C函數,你c在該函數中調用你的主UI線程。

你可以創建一個單例類並在初始化時將它賦給void指針,然後在你的C函數中做需要的事情。

+0

我嘗試了其他解決方案,它的工作。不過,你的看起來也會起作用。謝謝你的時間。 – 2011-05-11 12:58:47

+0

謝謝你爲我工作。 – lppier 2012-11-19 10:36:45