gpt4 book ai didi

objective-c - NSStream 和套接字,未调用 NSStreamDelegate 方法

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

我已遵循指南 Setting Up Socket Streams并在我的类里面有效地复制了该代码。无论我尝试什么,委托(delegate)方法似乎都没有被调用。

在我的头文件中(基本上):

@interface myClass : NSObject <NSStreamDelegate> {
NSInputStream *inputStream;
NSOutputStream *outputStream;
}
- (void)connect;
@end;

连接方法:

- (void)connect {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)@"host.example.com", 1234, &readStream, &writeStream);

inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}

还尝试使用 CFStreamCreatePairWithSocketToCFHost()[NSStream getStreamsToHost:port:inputStream:outputStream: - 结果完全相同。

我在 connect 的开头设置了一个断点方法,遍历每一行,每个指针都是有效的,似乎指向正确的对象。

在 GDB 中,在 setDelegate 之后来电,po [inputStream delegate]版画 <myClass: 0x136380>正如预期的那样,它已正确设置委托(delegate)。

对于我的生活,我无法理解为什么它拒绝调用 stream:handleEvent:我类的方法:

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
NSLog(@"got an event");
}

希望我错过了一些非常简单和明显的东西,第二双眼睛可以发现我的错误。

提前感谢所有有耐心并花时间阅读到这里的人!

最佳答案

在这样的行中:

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

我没有使用 [NSRunLoop currentRunLoop],而是将其更改为 [NSRunLoop mainRunLoop]

编辑 2011-05-30:

这不起作用的原因是因为我通过 +[NSThread detachNewThreadSelector:toTarget:withObject:] 在后台线程中设置套接字。

这样做会创建一个新的运行循环,在读取 run loop developer documentation 之后我发现你需要告诉 NSRunLoop 手动运行。

在与主线程相同的运行循环中运行它在性能上很好,尽管我能够通过编写包装类并在后台线程上运行所有网络 I/O 来提高性能。

关于objective-c - NSStream 和套接字,未调用 NSStreamDelegate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4930957/

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