我知道这个问题已经被多次提出过了.
我为Xcode使用Socket.IO客户端(https://github.com/pkyeck/socket.IO-objc).问题是我需要在许多视图控制器中连接socketIO.
在ViewControllerA(.h文件)中我有这个:
#import "SocketIO.h"
@inteface ViewControllerA : UIViewController <SocketIODelegate> {
SocketIO *socketIO;
}
Run Code Online (Sandbox Code Playgroud)
(.m文件):
- (void) viewDidLoad {
...
[socketIO connectToHot:@"localhost" onPort:1234];
}
Run Code Online (Sandbox Code Playgroud)
而ViewControllerB是为聊天室而制作的,我需要将此socketIO对象用于与服务器进行通信.我是对的,我需要做这件事吗?
1)在ViewControllerB中,使其与ViewControllerA中的相同
#import "SocketIO.h"
@inteface ViewControllerA : UIViewController <SocketIODelegate> {
SocketIO *socketIO;
}
Run Code Online (Sandbox Code Playgroud)
2)在seque之前的ViewControllerA中进行以下操作:
#import "viewControllerB.h"
...
viewControllerB *viewControllerB = (viewControllerB *)[storyboard instantiateViewControllerWithIdentifier:@"viewControllerB"];
viewControllerB.socketIO = socketIO;
[self pushViewController:viewControllerB animated:YES];
Run Code Online (Sandbox Code Playgroud)
或者也许有一些简单的方法可以从许多视图控制器访问数据?
即使有些人不喜欢Singletons,我发现它们在这些类型的情况下非常有用,在这种情况下,没有明显的"所有者"的数据.Singleton是一个只存在于一个实例中的对象.它可以通过singleton类本身的静态方法访问:
SocketKeeperSingleton.h
@interface SocketKeeperSingleton : NSObject
@property (nonatomic, strong) SocketIO *socketIO;
+ (SocketKeeperSingleton *) sharedInstance;
@end
Run Code Online (Sandbox Code Playgroud)
SocketKeeperSingleton.m
#import "SocketKeeperSingleton.h"
@implementation SocketKeeperSingleton
// The synthesize will automatically generate a getter and setter
@synthesize socketIO = _socketIO;
+ (SocketKeeperSingleton *)sharedInstance {
static SocketKeeperSingleton *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (id)init {
if (self = [super init]) {
NSLog(@"In SocketKeeperSingleton init");
}
return self;
}
// Override the getter for your socket
- (SocketIO *)socketIO {
if (!_socketIO || check-to-see-if-your-socket-has-been-disconnected-or-failed) {
_socketIO = code-to-create-and-connect-your-socket-goes-here
}
return _socketIO;
}
@end
Run Code Online (Sandbox Code Playgroud)
然后,从项目的任何位置获取套接字,如下所示:
SocketIO *mySocketIO = [SocketKeeperSingleton sharedInstance].socketIO;
Run Code Online (Sandbox Code Playgroud)
祝好运!