【问题标题】:Close NSStreams when app goes to background当应用程序进入后台时关闭 NSStreams
【发布时间】:2012-07-23 20:01:03
【问题描述】:

我是 Objective C 和 ios 开发的新手。我通常使用 Java 编写 Android 应用程序,并且总是使用 onPause 调用来关闭我的套接字。但是,当我在 applicationWillResignActive 下调用我的关闭套接字方法时,我与我的流侦听器失去了通信,并且无法关闭输入和输出流。事实上,即使应用程序连接到服务器,两个流的流状态都显示 NSStreamStatusNotOpen 或 0。有什么想法吗?

谢谢

编辑

SocketHandler.m 类中的连接方法:

  -(void)connect:(int *)port ipAddress:(NSString *)ipAddress
{
        CFReadStreamRef readStream;
        CFWriteStreamRef writeStream;
        CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)ipAddress, port, &readStream, &writeStream);
        inputStream = (NSInputStream *)readStream;
        outputStream = (NSOutputStream *)writeStream;
        [inputStream setDelegate:self];
        [outputStream setDelegate:self];
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inputStream open];
        [outputStream open];
        NSLog(@"input stream id %i", inputStream);  
}

-(void)disconnect{

    NSLog(@"disconnect method called");

    socketStatus = [outputStream streamStatus];
    int status = socketStatus;
    NSLog(@"Stream Status is %i", status);

    if (status == 2) {
        [inputStream close];
        [outputStream close];
        NSLog(@"Socket Closed");
    }



}

【问题讨论】:

  • 您能详细说明一下吗?调用发送close:NSStream 应该关闭它,并发送你的代表stream:handleEvent:
  • 我相信问题在于无法从我的 AppDelegate 访问 NSInputStream 和 NSOutputStream 对象。我有一个名为 SocketHandler 的类,它有一个连接和断开连接方法。我从 UI 中的按钮调用连接和断开连接方法。但是,当我从应用程序委托中的 applicationwillresignactive 调用 disconnect 方法时,它的行为就像它无法访问流对象,这很奇怪,因为应用程序中的每个其他类都可以。
  • 您是如何创建连接到按钮的 SocketHandler 对象的?你如何从你的应用委托中发现这个对象?
  • 在我创建的 SocketHandler 类中创建并初始化了 NSInputStream、NSOutputStream 和 StreamStatus 对象。所以会发生什么是 App Delegate 类调用 SocketHandler 类的方法,这些方法创建流、连接它们和断开它们。如果需要,它还可以回复流状态。但是,当调用 SocketHandler 类中的 connect 方法来创建 Stream 对象并连接它们时,除了 App Delegate 之外的任何其他类都无法访问它们,这很奇怪,因为流不是在 App Delegate 类中创建的。

标签: ios tcp nsstream nsinputstream nsoutputstream


【解决方案1】:

好的,这是我自己问题的答案。

我创建了 3 个类:

TCPSocketAppDelegate TCPSocketViewController 套接字处理程序

在 Socket 处理程序类中,我有一个名为 Connect 的方法和另一个名为 Disconnect 的方法。他们在这里:

连接方法:

-(void)connect:(int *)port ipAddress:(NSString *)ipAddress
{
        NSLog(@"input stream id %i", inputStream);
        CFReadStreamRef readStream;
        CFWriteStreamRef writeStream;
        CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)ipAddress, port, &readStream, &writeStream);
        inputStream = (NSInputStream *)readStream;
        outputStream = (NSOutputStream *)writeStream;
        [inputStream setDelegate:self];
        [outputStream setDelegate:self];
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inputStream open];
        [outputStream open];
        NSLog(@"input stream id %i", inputStream);  
}

断开方法:

-(void)disconnect{

    NSLog(@"disconnect method called");
    NSLog(@"input stream id %i", inputStream);

    socketStatus = [outputStream streamStatus];
    int status = socketStatus;
    NSLog(@"Stream Status is %i", status);

    if (status == 2) {
        [inputStream close];
        [outputStream close];
        NSLog(@"Socket Closed");
    }



}

然后,我在 TCPSocketAppDelegate 类和 TCPSocketView Controller 类中创建了对 Socket Handler 类的引用对象。然而,当我这样做时,它为每个套接字创建了一个新的 SocketHandler 类实例,因此它们没有寻址同一个套接字,因此一个可以连接套接字但另一个不能访问它。为了解决这个问题,我简单地使用 +(void) 使连接和断开连接方法全局可访问。现在我不必在其他类中创建引用对象来调用方法。我希望这些信息能对以后的人有所帮助。

【讨论】:

    猜你喜欢
    • 2013-11-04
    • 2013-07-03
    • 2013-09-02
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多