2016-04-20 8 views
0

Also meine Frage ist, wie Callback funktioniert?Callbacks in Socket.IO-Client-Swift in objc Projekt

ich hatte das [SocketIOClientSwift-Swift][1] zu meinem [Objective-C] Projekt importiert. Hier ist mein Code:

NSURL *url = [[NSURL alloc] initWithString:@"http://myserver.com:8080"]; 
SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url options:@{ @"log": @YES, @"forcePolling": @YES }]; 

[socket onAny:^(SocketAnyEvent *event) { 
    NSLog(@"Receive Event %@", event); 
}]; 

[socket on:@"connect" callback:^(NSArray *data, SocketAckEmitter *ack) { 
    NSLog(@"socket connected"); 
    // [socket emit:@"echo" withItems:@[@"echo test"]]; 
}]; 

[socket connect]; 

So sehe ich nicht log mit Ereignis empfangen ... kein Rückruf des genannt werden, aber wenn ich die [socket emit:@"echo" withItems:@[@"echo test"]]; Kommentar-, wird der Rückruf aufgerufen und Ereignis empfangen. .. Log Start Ereignis anzeigen, wenn es eine Verbindung fehlgeschlagen ist. Wie ?

Antwort

2

Das sieht aus wie Speicherverwaltungsproblem. Wenn Sie die Zeile auskommentieren, behalten Sie den Sockel Objekt. Versuchen Sie, Socket Objekt woanders (als ein Klassenmitglied zum Beispiel) explizit zu behalten. Das sollte das Problem beheben.

Genau gesagt, Verschluss (Block) behält äußere Objekte, die im Verschluss verwendet werden. Sie können mehr hier lesen: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

Besonders relevant Abschnitt zu Ihnen ist: "Blöcke können Werte aus dem umschließenden Bereich erfassen". Ich hoffe es hilft.

Just for Problem Fehlerbehebung können Sie dies versuchen:

NSURL *url = [[NSURL alloc] initWithString:@"http://myserver.com:8080"]; 
SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url options:@{ @"log": @YES, @"forcePolling": @YES }]; 

static SocketIOClient* __currentSocket = nil; 
__currentSocket = socket; 

[socket onAny:^(SocketAnyEvent *event) { 
    NSLog(@"Receive Event %@", event); 
}]; 

[socket on:@"connect" callback:^(NSArray *data, SocketAckEmitter *ack) { 
    NSLog(@"socket connected"); 
}]; 

[socket connect]; 
+1

@Constantin Saulenco können Sie dies versuchen? –