在视图控制器之间传递socketIO连接

use*_*653 2 xcode ios xcode5

我知道这个问题已经被多次提出过了.

我为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)

或者也许有一些简单的方法可以从许多视图控制器访问数据?

Hun*_*apa 5

即使有些人不喜欢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)

祝好运!