我在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到服务器上创建一个套接字。浪费了太多资源。我的问题是如何通过一个套接字连接发送/接收数据?
答案 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>];