【问题标题】:iOS Something going wrong between Singleton, Delegate and SocketIOiOS Singleton、Delegate 和 SocketIO 之间出了点问题
【发布时间】:2014-06-03 08:39:25
【问题描述】:

我有多个视图需要处理 socket.io 的网络连接,所以我创建了单例类,即 MC_SocketHandler。下面是 MC_SocketHandler 类的代码。

//    MC_SocketHandler.h

#import <Foundation/Foundation.h>
#import "SocketIO.h"


@interface MC_SocketHandler : NSObject <SocketIODelegate>

// SocketIO
//@property (nonatomic) SocketIO *socketConnection;

+ (MC_SocketHandler *) sharedSocketHanderObj;
+ (SocketIO *) initHandShake;
+ (SocketIO *) getSocketConnection;

-(bool) isConnected;
-(void) disConnect;
-(void) fireAgentLeftChat;

@end

//  MC_SocketHandler.m

#import "MC_SocketHandler.h"
#import "MC_APIUtility.h"

@implementation MC_SocketHandler

SocketIO *socketConnection = nil;
static MC_SocketHandler *sharedSocketObj = nil;

+ (MC_SocketHandler *) sharedSocketHanderObj {
    if (sharedSocketObj == nil)
        sharedSocketObj = [[MC_SocketHandler alloc] init];

    return sharedSocketObj;
}

+(SocketIO*) initHandShake {

    if (socketConnection == nil) {
        NSDictionary *headers = [NSDictionary dictionaryWithObjectsAndKeys:[MC_APIUtility getApiToken], @"token", nil];
        socketConnection = [[SocketIO alloc] initWithDelegate:(id)self ];
        [socketConnection connectToHost:domain onPort:447 withParams:headers];
    }
    return  socketConnection;
}

+ (SocketIO *) getSocketConnection {
    return socketConnection;
}

-(bool) isConnected {
    if (socketConnection == nil)
        return socketConnection.isConnected;

    return false;
}

-(void) disConnect {
    if (socketConnection != nil && socketConnection.isConnected)
        [socketConnection disconnect];

    NSLog(@"Disconnected --- %hhd", socketConnection.isConnected );
    return;
}


// SocketIO Delegate
-(void) socketIODidConnect:(SocketIO *)socket {
    NSLog(@"Socket has Connected....");
}

-(void) socketIO:(SocketIO *)socket didReceiveEvent:(SocketIOPacket *)packet {

    NSString *data = packet.data;
    NSLog(@"---- didReceoveEvent - data - %@", data);

    // Grab data from packet
    NSDictionary *dict = packet.dataAsJSON;
    NSLog(@"EVENT DATA :- %@   DICT :- %@", data, dict);

    /*
     EVENTS To Listen
     onSuccessInit
     visitor_info
     new_visitor
     agent_online
     agent_offline
     agent_logout

     */
    dict = nil;

    // Pull out args fro mdict
    //NSArray *args = dict[@"args"];
}

-(void) socketIO:(SocketIO *)socket didReceiveMessage:(SocketIOPacket *)packet {
    NSLog(@"Rcvd Message - %@", packet.data);
}

-(void) socketIO:(SocketIO *)socket didSendMessage:(SocketIOPacket *)packet {
    NSLog(@"Send Msg - %@", packet.dataAsJSON);
}

-(void) socketIO:(SocketIO *)socket onError:(NSError *)error {
    NSLog(@"Error - %@", error);
}

-(void) socketIODidDisconnect:(SocketIO *)socket disconnectedWithError:(NSError *)error {
    NSLog(@"Disconnected With Error - %@", error);
}

-(void) fireAgentLeftChat {

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:[MainAppDataObject sharedAppDataObject].activeAgentChatItem.chatSessionId forKey:@"chat_session_id"];


    [socketConnection sendEvent:@"agentLeftChat" withData:dict];

    return;
}

- (void)dealloc {
    socketConnection = nil;
}



@end

我在 1 个视图中使用它的代码:

// Init SocketIO

SocketIO *socket = [MC_SocketHandler initHandShake];

// Fire Agent Online event
[socket sendEvent:@"setAgentOnline" withData:nil];

握手已正确完成,setAgentOnline 事件已正确发送。我触发的其他事件也正确完成。但, 当套接字通过 initHandshake 连接时,我相信“套接字已连接......”应该在日志中看到,因为它是用 socketIODidConnect 委托方法编写的。同样,我收到事件(我看到 socket.m 类的日志),但我的委托方法 didReceiveEvent 从未被调用。同样,我看不到任何委托方法的任何日志。 仅在 initHandShake 方法中,我还设置了委托: socketConnection = [[SocketIO alloc] initWithDelegate:(id)self ]; 但是为什么不调用这些方法。

我还想知道,当我收到事件时,我必须针对不同的事件执行不同的操作。我将如何转移到特定视图(视图的 obj 不会与 this 共享以调用他的方法)?如果我创建委托,那么我将不得不处理所有视图中的所有委托方法。解决这个问题的最佳方法是什么?以及为什么在我设置委托时没有链接和调用此单例和委托方法。我哪里错了?

任何帮助,指导都非常感谢。非常感谢。

【问题讨论】:

  • 纯 FWIW。这是通过宏正确且轻松地使用单例的通用非常简单的方法。 stackoverflow.com/a/23978596/294884 这可能会有所帮助,我希望它会加油!
  • 谢谢@JoeBlow。为了处理接收事件和管理它,我创建了一个委托类,就像这里工作的那样 - stackoverflow.com/questions/15994066/… 。所以为此,在我的所有观点中,我必须设置 delegate = self ,所以我可以写 SOCKIO.delegate = self;在所有视图中。像这样工作是否安全或 MC_SocketHandler *IOConnection = [MC_SocketHandler sharedSocketHanderObj]; IOConnection.delegate = self;在所有的观点是安全和更好的。我相信结果会一样,但我只关心安全和正确使用。
  • @JoeBlow,我将明确地使用我的其他单例类来实现这个 prefix.pch 想法。
  • 好吧,只有 MC_SocketHandler 类本身才是 sockio 的代表。所以,在 MC_SocketHandler 里面,你会说 SOCKIO.delegate = self.你不会在其他地方设置 SOCKIO 的代表。确实,看起来您甚至不会在其他地方“提及” SOCKIO,您现在只会使用您的单例。
  • 恐怕我对 SOCKIO 不熟悉,所以您将不得不等待其他人的帮助。可能是你更想只是 SUBCLASS sockio?让我们等待有关该主题的专家:)

标签: ios objective-c delegates singleton


【解决方案1】:

在 SocketIO 中,您创建一个 SocketIO

是吗?

其实叫“socketConnection”。我说的对吗?

那时...

你必须设置委托!!!

基本上,您的代码必须如下所示,

socketConnection =  make one of these.
socketConnection.delegate = self;

这可能是您的根本问题。希望对你有帮助!

PS,几乎可以肯定,您应该在 iOS 开发中仅使用属性。摆脱你的“传统”变量,只使用属性。

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多