Objective-C,处理未完成的NSTask的最佳方法

时间:2019-11-16 01:29:26

标签: objective-c macos dispatch nstask

我有一个异步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,但我想不通,我不确定这是否是正确的方法。感谢您提供有关最佳做法的任何建议。

1 个答案:

答案 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
    });