美好的一天,
我正在iPhone上编写一个自定义控制器,以用于在PC上运行的应用程序。我正在使用标准编码来设置&打开插座&在我的iOS客户端上写/接收数据。一切都很好,直到我去了具有弱WiFi连接的区域,iPhone或PC失去了连接。我使用Reachability
在iPhone上添加了WiFi连接的测试,该测试可按预期工作。我假设使用与NSStream
关联的三个可能的错误检查方法之一,我会知道连接的远端(即PC)是否存在问题。
我首先发送[outputStream streamStatus]
消息,期望在我关闭PC上的WiFi适配器时获得NSStreamStatusError
代码。我得到的是NSStreamStatusOpen
代码。
第二次尝试是检查write: maxLength:
的-1返回代码。相反,这给了(据说)成功发送的字节数。
第三次尝试是明确查看NSStream
代表正在收到的代码。大多数时候是NSStreamEventHasSpaceAvailable
,但从不NSStreamEventErrorOccurred
。
有人知道为什么吗?NSStream
类似于Reachability
(较旧版本)&只要手机有连接,就会快乐吗?
感谢您的任何见解。
rb
偶尔,尤其是插座,流可以遇到无法进一步处理流数据的错误。通常,错误表明流的一端没有某些东西,例如远程主机的崩溃或正在流的文件的删除。当大多数错误发生时,除了向用户报告错误外,流的客户端可以执行一些操作。尽管可以在关闭状态之前查询已报告错误的流对象,但不能重复使用读取或写入操作。
NSStream
和NSOutputStream
类通知您是否以多种方式发生错误:
1.如果流对象安排在运行循环中,则该对象将NSStreamEventErrorOccurred
事件报告给其在stream:handleEvent: message
中的委托。
2.在任何时候,客户端可以将streamStatus
消息发送到流对象,并查看其是否返回NSStreamStatusError
。
3.如果您尝试通过发送write:maxLength:
并返回-1来写入NSOutputStream
对象,则会发生写入错误。
确定流对象出现错误后,您可以使用StreamError消息查询对象以获取有关该错误的更多信息(以NSERROR对象的形式)。接下来,告知用户错误。清单1显示了运行循环 - 安排流对象的代表如何处理错误。
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
NSLog(@"stream:handleEvent: is invoked...");
switch(eventCode) {
case NSStreamEventErrorOccurred:
{
NSError *theError = [stream streamError];
NSAlert *theAlert = [[NSAlert alloc] init];
[theAlert setMessageText:@"Error reading stream!"];
[theAlert setInformativeText:[NSString stringWithFormat:@"Error %i: %@",
[theError code], [theError localizedDescription]]];
[theAlert addButtonWithTitle:@"OK"];
[theAlert beginSheetModalForWindow:[NSApp mainWindow]
modalDelegate:self
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
contextInfo:nil];
[stream close];
[stream release];
break;
}
// continued ....
}
}
有关更多详细信息:developer.apple-处理流错误