NSStream写入插座没有WiFi关闭的错误.为什么



美好的一天,

我正在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

偶尔,尤其是插座,流可以遇到无法进一步处理流数据的错误。通常,错误表明流的一端没有某些东西,例如远程主机的崩溃或正在流的文件的删除。当大多数错误发生时,除了向用户报告错误外,流的客户端可以执行一些操作。尽管可以在关闭状态之前查询已报告错误的流对象,但不能重复使用读取或写入操作。

NSStreamNSOutputStream类通知您是否以多种方式发生错误:

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-处理流错误

最新更新