所以我的问题是回调是如何工作的?
我已经将 [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];
所以我没有看到任何带有Receive Event... 的日志,没有回调被调用,但是如果我取消注释 [socket emit:@"echo"withItems:@[@ "echo test"]];
,回调被调用并且 Receive Event ... 如果存在连接失败,日志开始显示事件。怎么样?
最佳答案
这看起来像是内存管理问题。当您取消注释该行时 - 您保留了 socket 对象。尝试在其他地方显式保留 socket 对象(例如作为类成员)。这应该可以解决问题。
准确地说,闭包( block )保留了闭包中使用的外部对象。你可以在这里阅读更多: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html
与您特别相关的部分是:“Blocks Can Capture Values from the Enclosing Scope”。希望对您有所帮助。
只是为了解决问题,您可以试试这个:
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];
关于ios - objc 项目中 Socket.IO-Client-Swift 中的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36739014/