[英]Objective-C, best way to handle NSTask that isn't finished
我有一個異步dispatch queue
,它在后台從大文件中讀取數據。 在此過程中,它會做一些其他事情,包括一些NSTask
操作。 我面臨的問題是我用這些操作的結果填充了一些變量,並且在這些變量准備好(不是 NULL)時后台隊列已經移動。
我的代碼類似於以下內容:
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(backgroundQueue, ^{
// reading large files
...
NSTaskClass *operation = [[NSTaskClass alloc] init];
NSString *result = [operation doTask:filePath];
NSLog(@"result: %@" result); // returns NULL since task isn't done yet.
...
// continue large file operations
});
這將是處理這個問題的最佳方法嗎? 我考慮創建一個callback
,但我無法弄清楚,我不確定這是否是正確的方法。 感謝您對最佳實踐的任何建議,謝謝。
只是給你一個想法,希望能解決你的問題。
dispatch_sempahore
處理NSTaskClass
中的操作doTask
方法創建一個處理程序,使用- (void)doTask:(NSString *)filePath handler:(void(^)(NSString *result))handler
而不是- (NSString *)doTask:(NSString *)filePath
然后,您的代碼應如下所示:
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(backgroundQueue, ^{
// reading large files
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
...
NSTaskClass *operation = [[NSTaskClass alloc] init];
[operation doTask:filePath handler:^(NSString * _Nonnull result) {
// Get your result here
result = [NSString stringWithString:result];
...
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
NSLog(@"result: %@" result); // Here should be fine (not NULL)
...
// continue large file operations
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.