0

我正在使用 UITabBarController 开发一个应用程序。更具体地说,使用故事板。我希望我的所有选项卡都能够从服务器发送和接收数据。

问题是我不知道怎么做。只有具有 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 但似乎不起作用。

4

2 回答 2

2

创建一个单例很好,我所做的是而不是创建一个类函数(这将强制您的网络在每次切换选项卡时重新初始化连接)我使 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;

到目前为止,这对我来说非常有效。花了我很长时间才弄清楚,所以我希望这会有所帮助!

于 2012-12-09T18:17:45.427 回答
0

最简单的方法是创建一个 Singleton,我们称之为 NetworkCommunications。

使其成为单例(只会创建一个实例):

+(NetworkCommunications *)sharedManager {
    static dispatch_once_t pred;
    static NetworkCommunications *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[NetworkCommunications alloc] init];
    });
    return shared;
}

然后,您只需从选项卡中调用 [NetworkCommunications sharedManager] 即可访问该单个实例。

你也把你的网络代码放在那个实例中。

于 2012-09-03T08:53:57.590 回答