Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSStream和套接字,未调用NSStreamDelegate方法_Objective C_Nsstream - Fatal编程技术网

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

Objective c NSStream和套接字,未调用NSStreamDelegate方法,objective-c,nsstream,Objective C,Nsstream,我遵循了指南,并在课堂上有效地复制了这些代码。无论我尝试什么,委托方法似乎都没有被调用 在头文件中,我有(基本上): 还尝试使用了CFStreamCreatePairWithSocketToCFHost()和[NSStream getStreamsToHost:port:inputStream:outputStream:-所有结果都完全相同 我在connect方法的开头设置了一个断点,遍历了每一行,每一个指针都是有效的,似乎指向了正确的对象 在GDB中,setDelegate调用后,po[inp

我遵循了指南,并在课堂上有效地复制了这些代码。无论我尝试什么,委托方法似乎都没有被调用

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

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

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

在GDB中,
setDelegate
调用后,
po[inputStream delegate]
按预期打印
,因此它正确设置了委托

就我个人而言,我不明白为什么它拒绝在我的类上调用
流:handleEvent:
方法:

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
    NSLog(@"got an event");
}
希望我错过了一些非常简单和明显的东西,第二双眼睛可以发现我的错误


提前感谢有耐心并花时间阅读本文的所有人!

如下:

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
我没有使用
[nsrunlop currentlunloop]
而是将其更改为
[nsrunlop mainlunloop]

编辑2011-05-30: 这不起作用的原因是,我正在通过
+[NSThread detachNewThreadSelector:toTarget:withObject://在后台线程中设置套接字

这样做会创建一个新的运行循环,在阅读之后,我发现需要通知nsrunlop手动运行


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

只有在线程0上没有阻塞工作的情况下,该解决方案才会起作用。这通常是可以的,但更好的解决方案是crea创建一个新线程(即使用类方法按需创建线程),然后在该线程上排队。 i、 e

使用此选项,您可以使用以下方式安排输入流:

[self performSelector:@selector(scheduleInCurrentThread)
             onThread:[[self class] networkThread]
           withObject:nil
        waitUntilDone:YES];

这将允许您运行网络操作,而不再担心死锁。

@user102008编辑了我的响应以进行解释。您是否可以发布结束代码?出于某种原因,我将[nsrunlop currentlunloop]更改为[nsrunlop mainlunloop]在启动连接后不久,连接不会失败!在将套接字客户端从主线程中删除后,我停止了对inputStream的侦听(即使我的outputStream仍在工作,因为我可以在套接字服务器上进行监视).我刚刚更改了inputstream的运行循环,答对了:)你的问题和答案都帮助我知道该去哪里,但我不知道如何使用一个简单的按钮启动和连接??非常感谢。我在任务中使用Monotouch和打开套接字时遇到了同样的问题。使用主循环而不是当前(任务的线程)解决了问题。谢谢你的提示。我还有一个相关问题。当流被写入时,用户可以继续在后台移动应用程序。我更愿意让流在后台运行。我尝试使用beginBackgroundTask…来实现这一点,但无论我做什么,我都无法在pp在后台。你认为这是可能的吗?我们的一个教程应用程序会这样做。如果你仍在寻求帮助,你可能想在“保存PFObject”部分中查看。虽然我们的框架将其隐藏,但后台任务中的部分会进行网络调用。这段代码是否足以耗尽自动释放功能定期调用池?
-[NSRunLoop run]
的文档中说,它将重复调用
runMode:beforeDate:
。这意味着在这些调用之间不会耗尽自动释放池。
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ (NSThread *)networkThread {
    static NSThread *networkThread = nil;
    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{
        networkThread =
             [[NSThread alloc] initWithTarget:self
                                     selector:@selector(networkThreadMain:)
                                       object:nil];
        [networkThread start];
    });

    return networkThread;
}

+ (void)networkThreadMain:(id)unused {
    do {
        @autoreleasepool {
            [[NSRunLoop currentRunLoop] run];
        }
    } while (YES);
}

- (void)scheduleInCurrentThread
{
    [inputstream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                           forMode:NSRunLoopCommonModes];
}
[self performSelector:@selector(scheduleInCurrentThread)
             onThread:[[self class] networkThread]
           withObject:nil
        waitUntilDone:YES];