如何从appdelegate分享NSOutputStream?

时间:2013-06-19 16:03:35

标签: ios nsoutputstream

我在appdelegate中设置套接字连接,从app开始连接到服务器。 在appdelegate.h

@interface AppDelegate : NSObject <NSStreamDelegate,UIApplicationDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
    NSInputStream *inputStream;
 NSOutputStream *outputStream;
}

然后在appdelegate.m中设置连接到服务器:

 CFReadStreamRef readStream;
 CFWriteStreamRef writeStream;
 CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"111.111.111.11", 111, &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];

应用启动时运行良好。沟通也很好。

然后我有一个标签控制器。每个选项卡都需要通过此套接字将数据交换到服务器。我不想为每个标签创建不同的套接字。

如何使用相同的输出流/输入流?

我在firstviewcontroall.m中尝试这个但是失败了:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSData *data = [[NSData alloc] initWithData:[@"hello this is firstview" dataUsingEncoding:NSUTF8StringEncoding]];
 [outputStream write:[data bytes] maxLength:[data length]];
}

没有数据发送到服务器。我不想在每个viewcontroller到服务器上创建一个套接字。浪费了太多资源。我的问题是如何通过一个套接字连接发送/接收数据?

2 个答案:

答案 0 :(得分:2)

通过以下方式使用流:

AppDelegate *appDel = (AppDelegate *)[UIApplication sharedApplication].delegate;
[appDel.outputStream write:[data bytes] maxLength:[data length]];
[appDel.inputStream <CALL_YOUR_METHOD>];

答案 1 :(得分:1)

我会创建一个实用程序/管理器类来处理与服务器的通信。这样,您就可以轻松地从代码的其他部分访问它。也很容易确保它是线程安全的。请注意,您应该考虑不在主线程上执行这些操作。

但是,如果您确实想要访问AppDelegate中定义的变量,那么这是代码:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.outputStream <method>];