在tabBarView管理套接字流
我正在开发一个应用程序使用UITabBarController。更具体地说,使用storyBoard。我希望我的所有标签都能够从服务器发送和接收数据。在tabBarView管理套接字流
问题是我不知道如何。只有具有initNetworkCommunications的第一个选项卡才能够从服务器发送和接收数据。那么,为了让我的应用能够发送和接收其他选项卡,我该怎么做?
我发现使用NSNotificationCentre来处理数据会工作,但有另一种方式吗?
下面是创建套接字连接的代码
-(void)initNetworkCommunication
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"169.254.1.1", 2000, &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];
}
可以说我有2个选项卡。第一个标签有一个连接按钮,用于调用initNetworkCommunication。从这个标签我能够发送和接收数据。但是,我如何处理另一个标签?有没有办法链接这个连接?
我试着导入对方的控制器并使用[FirstController sendMessage];来自secondViewController但似乎不起作用。
最简单的方法是创建一个Singleton,我们称它为NetworkCommunications。
为了让辛格尔顿(只有一个实例将被创建):
+(NetworkCommunications *)sharedManager {
static dispatch_once_t pred;
static NetworkCommunications *shared = nil;
dispatch_once(&pred, ^{
shared = [[NetworkCommunications alloc] init];
});
return shared;
}
然后你只需要调用[NetworkCommunications sharedManager]从您的选项卡,以访问该单个实例。
你也把你的网络代码放在那个实例中。
创建一个singleton很好,我所做的就是不用创建一个类函数(这将迫使你的网络在每次切换标签页时重新初始化连接)我使用networkconnector作为自定义实现的一个属性的TabBar的:
#import <Foundation/Foundation.h>
#import "NetworkController.h"
@interface NetworkStorageTabBarController : UITabBarController
@property (nonatomic, strong) NetworkController *thisNetworkController;
@end
和实现文件:
#import "NetworkStorageTabBarController.h"
@implementation NetworkStorageTabBarController
@synthesize thisNetworkController;
@end
后来,当我打开了我的标签视图,我称这种现象为第一视图的viewWillAppear中会出现:
//set up networking
NetworkStorageTabBarController *thisTabBar = (NetworkStorageTabBarController *) self.tabBarController;
self.thisNetworkController = thisTabBar.thisNetworkController;
self.thisNetworkController.delegate = self;
到目前为止,这对我来说是光荣的。让我永远把它弄清楚,所以我希望这有助于!
你是什么意思你把你的网络代码在那个实例呢? – user1634769
把所有与网络相关的方法,如initNetworkCommunication。 – Resh32