6
有一個簡單的一次性任務需要一個進度條。 OpenSSL的有一個有用的 回調哪一個可以使用的是:但是我想沒有太多費周折從的ObjectiveC稱之爲ObjC塊和openssl C回調
rsa=RSA_generate_key(bits,RSA_F4,progressCallback,NULL);
與
static void callback(int p, int n, void *arg) {
.. stuff
:
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeAnnularDeterminate;
hud.labelText = @"Generating CSR";
[self genReq:^(int p,int n,void *arg) {
hud.progress = --heuristic to guess where we are --
} completionCallback:^{
[MBProgressHUD hideHUDForView:self.view animated:YES];
}];
隨着Genrec :作爲objC方法:
-(void)genReq:(void (^)(int,int,void *arg))progressCallback
completionCallback:(void (^)())completionCallback
{
.....
rsa=RSA_generate_key(bits,RSA_F4,progressCallback,NULL);
assert(EVP_PKEY_assign_RSA(pkey,rsa));
rsa=NULL;
....
completionCallback();
}
現在completionCallback();出色地和預期地工作。但我得到一個編譯器警告/錯誤,我不能平息時進度回調:
Passing 'void (^__strong)(int, int, void *)' to parameter of incompatible type 'void (*)(int, int, void *)'
所以很好奇 - 什麼是適當的方式做到這一點?
謝謝,
Dw。
最可愛!而__bridge是ARC所需要的。慚愧,需要有回調()之間 - 即無法通過progressCallback作爲(void(*)(int,int,void *))從它的void(^ __強)(int,int,void * )直接。 –
@ Dirk-WillemvanGulik - 支持塊自動傳遞的唯一合理方法,即閉包(代碼指針+環境)作爲函數指針(只是一個代碼指針)可以動態生成代碼存根;並且具有各種缺點。 C中的通用模式是指定一個帶有額外值的函數指針,通常是'void *'類型,可用於傳遞用戶定義的環境,從而手動構造閉包 - openssl遵循該模式,解決方案上面只是用它。 – CRD
清除。再次感謝!)。已經挖掘到NSStackBlock,並使總體感覺。 –