我正在使用UITabBarController开发一个应用程序。更具体地说,使用storyBoard。我希望我的所有标签都能够从服务器发送和接收数据。
问题是我不知道怎么做。只有具有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];
}
假设我有两个标签。第一个选项卡有一个连接按钮,用于调用initNetworkCommunication。从这个标签我可以发送和接收数据。但是我如何处理其他标签?有没有办法将此连接链接起来?
我试图导入彼此的控制器并使用[FirstController sendMessage];来自secondViewController但似乎不起作用。
答案 0 :(得分:2)
创建一个单例很好,我所做的不是创建一个类函数(这会强制你的网络每次切换标签时重新启动连接)我使网络连接器成为自定义实现的属性的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;
到目前为止,这对我来说是光荣的。让我永远想清楚,所以我希望这有帮助!
答案 1 :(得分:0)
最简单的方法是创建一个Singleton,让它称之为NetworkCommunications。
使它成为Singleton(只创建一个实例):
+(NetworkCommunications *)sharedManager {
static dispatch_once_t pred;
static NetworkCommunications *shared = nil;
dispatch_once(&pred, ^{
shared = [[NetworkCommunications alloc] init];
});
return shared;
}
然后,您只需从选项卡中调用[NetworkCommunications sharedManager]即可访问该单个实例。
您也可以将网络代码放在该实例中。