gpt4 book ai didi

ios - 等待线程 Objective C 中的值发生变化

转载 作者:行者123 更新时间:2023-11-28 19:26:37 26 4
gpt4 key购买 nike

我在 Objective-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 的值并返回我正在使用的值

cocoa

我正在将值返回给另一个应用

谁能帮忙。

谢谢

最佳答案

例如,您在这里所做的需要使用信号量。如果除了您在此处提供的之外别无其他,那么后台运行方法的完成 block 是最好的方法。 请参阅下面的选项 2

无论哪种方式,为什么要让父线程(调度新线程的线程)等待另一个线程?如果父线程正在等待,它会被锁定,直到分派(dispatch)的线程完成(根据您的要求)。这种情况是多余的,因为分派(dispatch)另一个线程的全部目的是为了让父线程可以继续处理其他事情。当然除非父线程需要等待多个线程,否则锁定它是有意义的。

话虽如此,最好让调度线程/父线程执行您正在调度到另一个线程的处理。鉴于您提供的详细信息,我只是这么说。

  • 选项 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 使用完成 block (首选)

使用传递给子线程的完成 block 。这允许父线程继续。如果它是主线程,它仍然可以自由处理 UI 内容。

-(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 的值可以在完成 block 中传回。

请引用Apple's documentation在带有完成句柄的 openURL 上

关于ios - 等待线程 Objective C 中的值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53793973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com