在tabBarView中管理套接字流

时间:2012-09-03 05:36:59

标签: objective-c ios sockets uitabbarcontroller nsstream

我正在使用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但似乎不起作用。

2 个答案:

答案 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]即可访问该单个实例。

您也可以将网络代码放在该实例中。