iOS - 在整个iOS应用程序中实现websocket连接的最佳解决方案?

时间:2015-04-28 09:38:18

标签: ios objective-c websocket socketrocket

在我的应用中,ViewController连接和通信属于特定websocket,但后来请求通过websocket在整个应用中接收消息。

最好的方法是什么?要将AppDelegate代码移至ViewController或创建超级{{1}}?或其他更好的东西?

2 个答案:

答案 0 :(得分:4)

如果要求您的应用始终与外部方通信,并且多个视图控制器可以显示消息并对其执行操作,则需要将通信移至单独的实例并为您提供界面查看控制器与之交互。

我会创建一个通信类或一组类,您可以在appDelegate中创建一个共享实例。然后,不同的视图控制器可以通过appDelegate或您提供的其他一些机制访问此共享实例。

这有多复杂取决于您的确切要求。

修改以下评论更新要求:

要求似乎是您希望能够始终接收消息,无论视图控制器如何,但能够通过视图控制器发布消息。

要执行此操作,您希望让您的共享实例提供用于打开连接的API。让它注册在runloop上连接的Web套接字(不确定您使用的是哪个Web套接字API),以便在有活动时处理通信,在没有活动时执行其他操作。您可以在主线程或后台线程上执行此操作,这一切都取决于您认为消息将添加多少负载。

让新的共享实例处理所有传入的消息并将它们放在内部队列中。为客户端实例(如视图控制器)提供订阅接口以注册传入消息通知。您可以将其设置为直接界面或使用通知。您的选择取决于用例。如果视图控制器可以及时返回,那么您需要提供对过去接收和发送的完整消息集的访问权限。除非邮件是短暂的并且您不存储历史记录,否则将需要一个清除这些文件或缓存到文件的策略。

对于发送消息,请在共享实例中提供API,该API允许将消息排队等待发送以及将来的确认。使用运行循环机制在套接字准备好写入以发送消息时得到通知。将消息发送确认提供回发送UI,以便UI不会被阻止等待发送,并允许在第一个消息被写入时写入其他消息。

这里有很多工作要做。

答案 1 :(得分:2)

您必须使用单身模式。您可以这样实现:

#import <foundation/Foundation.h>

@interface MyManager : NSObject {
    NSString *someProperty;
}

@property (nonatomic, retain) NSString *someProperty;

+ (id)sharedManager;

@end

#import "MyManager.h"

@implementation MyManager

@synthesize someProperty;

#pragma mark Singleton Methods

+ (id)sharedManager {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}

- (id)init {
  if (self = [super init]) {
      someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
  }
  return self;
}

@end

然后你可以通过

从任何地方引用单身人士
MyManager *sharedManager = [MyManager sharedManager];

像这样,你可以在一个地方使用websocket的所有方法,可以从任何地方获得。

我希望这会对你有所帮助