在我的应用中,ViewController
连接和通信属于特定websocket
,但后来请求通过websocket
在整个应用中接收消息。
最好的方法是什么?要将AppDelegate
代码移至ViewController
或创建超级{{1}}?或其他更好的东西?
答案 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的所有方法,可以从任何地方获得。
我希望这会对你有所帮助