我目前正在尝试连接到tcp服务器。一切都很好,但如果服务器不可用,应用程序冻结约30秒,这不是很好。我已经搜索了一个分辨率,但到目前为止找不到有用的东西。
也许有人有解决方案来检查连接?
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)@"IP_SERVER_PATH", 6666, &readStream, &writeStream);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
答案 0 :(得分:5)
永远不要在主线程上执行网络操作!使用单独的后台线程。寻找NSThread。
答案 1 :(得分:2)
答案 2 :(得分:0)
正如H2CO3所说:你因为设计错误而挂了30秒(如果你只是测试,那么):你永远不应该放置任何可能长的/不确定的等待时间(例如外部连接)线程。
话虽如此,我建议你让你的应用程序像消息传递系统一样:将外部通信检查提交给在用户转移到其他(非依赖)步骤时在后台发生的线程。
如果网络数据量不是问题,请在计时器上放置一个后台线程,通过发送“心跳”或"stayalive" messages, like this example不断检查您的连接。这样,当你的用户愉快地做她的事情时,你有一个后台线程检查,如果有必要,重新建立到远程服务器的套接字连接。
如果您还可以控制套接字服务器开发,我建议您记录心跳消息的详细信息。您可以按顺序对它们进行编号(或者对它们进行unixtime时间戳记),然后保存到日志中,这样您就可以了解问题在现实生活中的重要程度。这可能是一个高效的调试工具。
像这样:A0001,A0002,A0003,B0001,A0004,B0002,B0003,A0005,C0001
其中A,B,C是连接ID(和/或您认为相关的任何其他数据,例如原始IP)。