gpt4 book ai didi

objective-c - 如何包装异步类使其同步?使用 NSRunLoop?

转载 作者:太空狗 更新时间:2023-10-30 03:43:41 25 4
gpt4 key购买 nike

我目前正在开发一个 iPhone 应用程序,我有一个来自第三方的库,该库具有异步行为,但我想用我自己的类包装它并使其看起来是同步的。

这个库中的中心类,我们称它为 Connection 类,有几个函数,当调用委托(delegate)类实例上的方法时,这些函数的最终结果将被解析。我想要做的是包装这个类和委托(delegate),这样它看起来是同步的而不是异步的。如果我在 Java 中这样做,我会使用 FutureTask 或 CountdownLatch 或只是 join()。但我不确定在 Objective C 中执行此操作的最佳方法。

我首先创建了一个 NSThread 扩展,NFCThread,它符合上述委托(delegate)协议(protocol)。我的想法是,我将初始化和 NFCThread,将 NFCThread 实例传递给 Connection 的 setDelegate 方法,启动线程,然后在 Connection 上调用异步方法。我的预期是 NFCThread 实例上的三个委托(delegate)方法之一将被调用,最终导致线程退出。

为了模拟连接,我执行了以下操作。我向 NFCThread 添加了一个 NSConditionalLock:

joinLock = [[NSConditionLock alloc] initWithCondition:NO];

调用 Connection 的代码如下所示:

NFCThread *t = [[NFCThread alloc] init];
[connection setDelegate:t];
[t start];

[connection openSession];
// Process errors, etc...

[t.joinLock lockWhenCondition:YES];
[t.joinLock unlock];
[t release];
[connection setDelegate:nil];

委托(delegate)协议(protocol)具有三个方法。在 NFCThread 中,我实现了如下每个方法:

- (void)didReceiveMessage:(CommandType)cmdType 
data:(NSString *)responseData
length:(NSInteger)length {
NSLog(@"didReceiveMessage");
// Do something with data and cmdType...
[joinLock lock];
[joinLock unlockWithCondition:YES];
callBackInvoked = YES;
}

我重载了 NFCThread 的主要方法,以便它不断循环。像这样:

while (!callBackInvoked) { ; }

我发现这并不是一个好主意,因为它会导致 CPU 使用率飙升。因此,我尝试使用我在该站点上找到的一些示例中的运行循环:

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];

while (!callBackInvoked) {
[runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}

在我的两个实现中,主线程总是被阻塞,而且似乎没有调用任何委托(delegate)方法。但是,我知道该库运行正常,并且通常会调用对委托(delegate)方法的调用。

我觉得我在这里遗漏了一些明显的东西。非常感谢任何帮助。

丰富

最佳答案

您需要一个信号量,这将允许您的主要代码路径阻塞,直到您的异步回调向信号量发出信号并允许它继续。

信号量在 iOS 4 中通过 Grand Central Dispatch 可用。

信号量的行为似乎可以在 iOS 3 中使用 NSCondition 实现。

关于objective-c - 如何包装异步类使其同步?使用 NSRunLoop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3419744/

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