我有一个异步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
,但我想不通,我不确定这是否是正确的方法。感谢您提供有关最佳做法的任何建议。
答案 0 :(得分:0)
只给您一个想法,希望解决您的问题。
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
});