因此,採用一些手機視窗程式等第三方 SDK 時,更是容易碰到 nonblocking functions。這會使得規劃的 function flow 有點亂掉。
在 iOS app development 環境中,以 block 為例,可以透過 semaphore 來達成 blocking 效果,如:
dispatch_semaphore_t waitJobDone = dispatch_semaphore_create(0);
[self callBlock:^{
// do something
dispatch_semaphore_signal(waitJobDone);
}];
dispatch_semaphore_wait(waitJobDone, DISPATCH_TIME_FOREVER);
順便筆記一下其他東西,隨意使用 nonblocking 用法:
dispatch_async( dispatch_queue_create(“job_running”, NULL), ^{
});
在非 UI thread 中,又想動 UI 方式:
dispatch_async( dispatch_queue_create("job_running", NULL), ^{
// do something ...
dispatch_async(dispatch_get_main_queue(), ^{
// update ui
});
});
最後一提,如果用到的 SDK 跟網路相關的(NSURLConnection),那大多不能用 semaphore 來使之改成 blocking 模式(或是改法很繁雜要深入or破壞SDK架構),這跟 NSURLConnection Delegate Callback 設計有關(NSRunLoop)。
沒有留言:
張貼留言