代码在AppDelegate中工作,但在任何其他类中都没有
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码在AppDelegate中工作,但在任何其他类中都没有相关的知识,希望对你有一定的参考价值。
我正在使用socket.io客户端进行swift。当我声明并连接套接字并在AppDelegate中使用它的命令时,一切正常。但是,只要我将这些东西从AppDelegate移动到另一个类(使socket成为全局变量)并从AppDelegate调用该类的函数,就会出现套接字错误(错误的描述与此主题无关。我有一个关于Socket.io问题的讨论)我想问的问题是这种情况发生了吗?我用过
deinit {
NSLog("CCNOTIFICATIONS RESOURCES GOT DE INITIALIZED")
}
在该文件中,但这永远不会被调用。
根据我的知识,AppDelegate是一个委托,当应用程序的状态发生变化时会被调用,即它的启动或转到后台/前台。而且,在AppDelegate中混乱大量代码并不是一个好习惯。显然这两个文件的范围没有区别,为什么会发生这种情况呢?
如果我的理解错了,请纠正我。如何解决这个错误问题?或者至少我可以尝试解决这个问题的其他方法?任何帮助,将不胜感激。
更新:这是代码:当我在AppDelegate中写它:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
public static var socket = SocketIOClient(socketURL: URL(string: “URL”)!, config: [.log(true), .compress])
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
AppDelegate.socket.connect()
AppDelegate.socket.on("connect") {data, ack in
print("Connected successfully")
}
AppDelegate.socket.on("book-adventure-provider") {data, ack in
print("BOOKING CAME")
print(data)
}
return true
}
当我把它写在其他文件中时:
CCNotifications:
public class CCNotifications : INotifications
{
public var socket = SocketIOClient(socketURL: URL(string: “URL”)!, config: [.log(true), .compress, .forcePolling(true), .forceNew(true)])
public func sendBookingRequest(adventureId: String, success: @escaping () -> Void, error: @escaping CErrorCallback) {
if (ConnectionStatus.isConnected() == false)
{
let errorObj = CError()
errorObj.message = "No internet connection"
errorObj.code = ClientConstants.connectionErrorCode
error(errorObj)
}
else
{
let jwtToken = KeychainWrapper.standard.string(forKey: "jwtToken")
let data = ["adventure_id": adventureId, "jwt": jwtToken]
socket.emit("book-adventure", data)
socket.on("book-adventure-seeker") { data, ack in
print(data)
}
}
}
}
CuufyClient:
public class CuufyClient : IClient {
public var notifications: INotifications? = nil
public static var Notifications: INotifications? { get { return CuufyClient.client?.notifications}}
//region Actions
public static func Initialize(completion: ((_ error: CError?) -> Void)?) {
CuufyClient.client?.notifications = CCNotifications ()
completion? (nil)
}
//endregion
}
最后将其称为:
CuufyClient.Notifications?.funcWhichIWannaCall.
注意:两种方式都有效。但是当我在CCNotifications中编写代码并运行它时,有时会开始给出套接字错误:会话ID未知,然后一次又一次地连接自己。
更新2:日志中的套接字错误之前的一行我发现了这个错误:
2017-12-15 15:45:34.133480+0500 TestTarget[5332:230404] TIC Read Status [1:0x60000017f440]: 1:57
在搜索此错误后,我知道在Xcode 9中,此错误显示TCP连接已关闭。当我在socket.io分支上打开这个问题时,专家说:
该库在底层网络上运行相当高的级别。它依赖于URLSession或Starscream在连接丢失时告诉它。
任何人都可以帮助我关于URLSession,为什么TCP关闭,因为我对ios很新。
首先要说的是,保持AppDelegate
薄的方法是一个好主意。
关于deinit
:当对象不再存在时,将调用此函数。由于全局变量将“永久”生命 - 只要它们被分配给不同的对象 - 它们将仅在程序终止时被清除(不是:后台模式等)。因此,您将永远不会看到deinit调用。
你对生命周期的看法是正确的,如果你已经完成了所有事情应该没有区别 - 我在这里无法判断,因为你没有显示任何关于如何以及何时创建/初始化全局套接字的代码等。
关于更新的问题:不幸的是,我不知道socket.io库。但是,只需简短的介绍,您的代码在AppDelegate
和其他版本之间略有不同。这可能是一个时间问题 - 只需检查(并修复)一些事情:
- 你什么时候打电话给
connect()
? - 在连接或调用
...on()
之前,您可能需要首先设置所有emit
-Handler;否则服务器可能会在所有设置正确之前做出响应 - 检查您是否可以集中设置
...on()
-Handlers,而不是每次sendBookingRequest
调用 - 什么是
jwtToken
?它是您的应用程序的API令牌,还是某种类型的标记令牌?您何时存储该值,为什么它存储在钥匙串中?请求/响应期间它的价值可能会发生变化吗?
您不应该在sendBookingRequest
方法中放置套接字事件侦听器。您只需要绑定一次套接字事件侦听器。
socket.on("book-adventure-seeker") { data, ack in
print(data)
}
所以,你可以把它放在connect
事件上。
AppDelegate.socket.on("connect") {data, ack in
print("Connected successfully")
}
以上是关于代码在AppDelegate中工作,但在任何其他类中都没有的主要内容,如果未能解决你的问题,请参考以下文章
C++ 代码在 VS2010 中工作,但在 2013 年不工作
UITableView 在 3.2 中工作,但在 4.0(模拟器和设备)中没有触发任何 tableview 方法
变量 args SFINAE 默认构造函数在 clang 中工作,但在 Visual Studio 2015 中失败
NuxtJS:在开发中工作但在生产中工作的路由(netlify)
Jquery 表单提交不能在 chrome 中工作,但在 Firefox 中工作
UIAlertController 实用程序类无法调用 UITextField 委托或目标,但在 UIViewController 中工作