Ожидание изменения значения в потоке Цель C - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть вызов потока в цели C, и я хочу, чтобы, как только этот поток закончился, я хочу вернуть значение; значение будет изменено внутри потока, поэтому метод не должен возвращать значение, пока не закончится шаг

Вот код, который я использую:

[NSThread detachNewThreadSelector:@selector(CheckBeforePrint2) toTarget:self withObject:nil];

Это мой полный код

- (NSString *) getStatusPrinter:(NSString *) printerSerialNumber
{
    self.printerSN = printerSerialNumber;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *Result = @"-1";
    [NSThread sleepForTimeInterval:2.0f];       

    [NSThread detachNewThreadSelector:@selector(CheckBeforePrint) toTarget:self withObject:Result];

    [pool release];
    return  Result;
}

Теперь я хочу дождатьсяЗначение Result и вернуть его я использую

какао

И я возвращаю значение в другое приложение

Может ли кто-нибудь помочь в этом.

Спасибо

1 Ответ

0 голосов
/ 17 декабря 2018

То, что вы здесь делаете, требует использования semaphore, например.Если в этом нет ничего, кроме того, что вы предоставляете здесь, то лучший способ сделать это - выполнить блок завершения для метода фонового запуска. См. Вариант 2 ниже

В любом случае, почему вы хотите, чтобы родительский поток (поток, отправляющий новый поток) ожидал другого потока?Если родительский поток ожидает, он блокируется до тех пор, пока не будет завершен отправленный поток (согласно вашему требованию).Эта ситуация избыточна, потому что весь смысл отправки другого потока заключается в том, чтобы родительский поток мог продолжить выполнение других задач.Если, конечно, родительский поток не должен ожидать нескольких потоков, то имеет смысл заблокировать его.

Сказав это, лучше всего просто позволить потоку-отправителю / родительскому потоку выполнить обработку, на которую вы отправляетев другую ветку.Я говорю это только с учетом предоставленной вами информации.

  • ВАРИАНТ 1 использовать семафор

Использовать семафор для блокировки и разблокировки родительского потока

-(void)getStatusPrinter()
{   
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [NSThread detachNewThreadSelector:@selector(checkBeforePrint2) toTarget:self withObject: semaphore];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [self print]; // this will run after semaphore is unlocked
}

-(void)checkBeforePrint2:(dispatch_semaphore_t)sem
{
    //this is within child thread
    //do some processing,
    dispatch_semaphore_signal(sem);//unlock semaphore
}

Но, как я упоминал ранее, эта ситуация кажется избыточной, поскольку родительский поток ожидает (поэтому не может использоваться) дочерний поток;почему он не может просто выполнить саму работу ...


  • ВАРИАНТ 2 использовать блок завершения (PREFERABLE)

Использоватьблок завершения, который вы передаете дочернему потоку.Это позволяет родительскому потоку продолжить.Если это основной поток, он остается свободным для пользовательского интерфейса.

-(void)getStatusPrinter()
{   
    [self checkBeforePrint2WithCompletion: ^{
        [self print];
    }];
    //continue with more stuff
}

-(void)checkBeforePrint2WithCompletion:(void (^ __nullable)(void))completion
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //do something before executing completion code

        if(completion){
            completion();
        }
    });
}

Отказ от ответственности: в этом коде могут быть опечатки, так как они не были написаны в редакторе / IDE.Пожалуйста, прокомментируйте, если таковые имеются.


  • ОБНОВЛЕНИЕ в ответ на добавленные детали.

Хорошо, за то, что вы сказали, что вам нужновернуть результат в другое приложение, это означает, что поток записи в getStatusPrinter не может быть возвращен после отправки нового потока.Если вам действительно нужно создать новый поток для CheckBeforePrint, то поток ввода должен ждать.Это для меня бессмысленно.Вы можете просто запустить все в потоке ввода.

Если вы используете openURL:options:completionHandler:, то поток ввода не должен ждать.Значение result может быть передано обратно в блоке завершения.

Пожалуйста, обратитесь к документации Apple на openURL с дескриптором завершения

...