gpt4 book ai didi

objective-c - 将异步调用包装到同步阻塞线程中?

转载 作者:技术小花猫 更新时间:2023-10-29 10:56:20 25 4
gpt4 key购买 nike

我正在编写一个当前异步发送电子邮件(使用委托(delegate))的 iOS 模块。它使用 SKPSMTPMessage效果很好。我的问题是客户希望代码在电子邮件发送(或发送失败)之前完全阻塞线程。所以他们基本上是在寻求同步解决方案,目前它将尝试发送电子邮件,然后在电子邮件发送之前从该代码块返回。

因此,与其尝试以同步方式重写 SKPSMTPMessage 代码(似乎没有任何同步选项),我希望找到某种方式来包装该 block 异步代码在它自己的线程中,并可能让主线程等待它完全结束(委托(delegate)和所有)。

我已经使用 NSOperationNSThread 尝试了几种不同的方法,但也许我做的不对,因为每次我试图阻塞主线程时,异步委托(delegate)调用似乎仍未完成(它们是否返回到主线程或其他什么?)。

感谢任何信息甚至其他想法。

PS ~ 我意识到这有点倒退。在大多数情况下,异步似乎是可行的方法,但这是一种特殊情况,客户有他们想要它的理由。

编辑:感谢您提供的所有信息。正如其中一个答案所建议的那样,我最终只使用了一个 while 循环,它等待代表返回但让 runLoop 继续,就像这样:

while( ![messageDelegate hasFinishedOrFailed] ){
// Allow the run loop to do some processing of the stream
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}

最佳答案

我会尝试使用调度信号量。来自 dispatch_semaphore_create(3) 的手册页:

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

dispatch_async(queue, ^{
foo();
dispatch_semaphore_signal(sema);
});

bar();

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
sema = NULL;

dispatch_semaphore_wait() 的调用将阻塞,直到对 dispatch_semaphore_signal() 的调用完成。

关于objective-c - 将异步调用包装到同步阻塞线程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582761/

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