【问题标题】:NSInputStream from URL doesn't seem to be getting anything来自 URL 的 NSInputStream 似乎没有得到任何东西
【发布时间】:2014-08-14 02:38:54
【问题描述】:

我有以下代码,我知道它正在运行:

ReadDelegate * del = [[ReadDelegate alloc] init];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)(@"server.com"), port, &readStream, &writeStream);

NSInputStream * readSock = (__bridge_transfer NSInputStream*)readStream;

[readSock setDelegate:del];
[readSock scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

NSOutputStream * writeSock = (__bridge_transfer NSOutputStream*)writeStream;
[writeSock scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
NSLog(@"Open socket");
[readSock open];
[writeSock open];

[writeSock write:(uint8_t*)("request\0\0\0") maxLength:10];


while (YES) {
     //I'm skipping over inconsequential stuff
}
NSLog(@"finished reading");
[readSock close];
[writeSock close];

return [del getMessage];

我的 ReadDelegate 类声明为 @interface ReadDelegate : NSObject <NSStreamDelegate> 并包含 - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode。该特定函数中只有一个 print 语句,以查看它是否被调用过。不是。

我知道连接正在打开,因为我的服务器正在接收“request\0\0\0”消息并且服务器正在发送文件(我在其他可以接收文件的环境中进行了测试很好)。

但是,如前所述,在开头 (del) 中声明的 ReadDelegate 对象永远不会收到 stream 消息,即使是一次(表示流已打开或其他)。

为什么没有调用委托?

【问题讨论】:

    标签: objective-c cocoa nsinputstream


    【解决方案1】:

    由于您的 while 循环,您的流似乎没有收到事件。

    流中的每个新事件都可以在运行循环的新迭代中处理。但是新的迭代无法开始,因为当前的迭代永远不会结束。

    【讨论】:

    • 我没有带我的Mac,所以我稍后会尝试,但是运行循环不是在单独的线程中运行吗?有没有办法让它在单独的线程上运行?
    • [NSRunLoop currentRunLoop] 在进行调用的线程中运行,如果您想继续处理其事件,则不应阻止它。
    • 这行得通,谢谢!顺便说一句,我遇到了某种权限问题,这是由于 ReadDelegate 在此方法结束时被销毁的事实。所以当stream 被调用时,它是在一个dealloc'd 对象上调用它。我需要保留 ReadDelegate。
    • 这是一个架构问题。仅出于测试目的,您可以将委托设置为静态全局变量。
    • 最好的做法是什么?我不想让对象本身成为委托。
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    相关资源
    最近更新 更多