ios - objc 项目中 Socket.IO-Client-Swift 中的回调

标签 ios objective-c swift sockets socket.io

所以我的问题是回调是如何工作的?

我已经将 [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/

相关文章:

swift - 为什么闭包中的 self 不引用所属的类实例?

ios - Rx swift : Reacting to different cell types

iOS 10.1 , tabbar出现黑线

objective-c - Objective-C 的图像压缩库

swift - 如何在 Xcode 中使用 LLDB 获取附加到 View 的所有手势识别器?

swift - NSSplitViewController 的 'view' outlet 不应该指向它的 NSSplitView;改为使用 'splitView' socket

iOS——奇怪的异常(exception)

iphone - 在iPad上镜像应用程序屏幕需要什么?

ios - 为什么使用 Core Graphics 绘制直线我得到 "dashed"行?

objective-c - 复制 Yosemite 上的 Finder 选择背景?