簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM