所以我的问题是回调是如何工作的?
我已将[SocketIOClientSwift-Swift][1]
导入我的[Objective-C]
项目。
这是我的代码:
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];
所以我没有看到任何带接收事件的日志...... 没有回调被调用,但如果我取消注释[socket emit:@"echo" withItems:@[@"echo test"]];
,则会调用回调接收事件... 如果存在失败连接,则开始显示事件。怎么样?
答案 0 :(得分:2)
这看起来像内存管理问题。取消注释该行时 - 保留套接字对象。尝试在其他地方显式保留 socket 对象(例如,作为类成员)。这应该可以解决问题。
准确地说,闭合(块)保留在闭合中使用的外部物体。你可以在这里阅读更多: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html
特别相关的部分是:“块可以从封闭范围中捕获值”。希望它有所帮助。
只是问题疑难解答你可以试试这个:
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];