Ios Swift中socket.io的异常行为

Ios Swift中socket.io的异常行为,ios,xcode,swift,sockets,lifecycle,Ios,Xcode,Swift,Sockets,Lifecycle,根据标题,我在处理socket.io时遇到了一些问题。它在第一个视图控制器中连接得非常好,但在第二个控制器中会发生奇怪的事情 代码如下: 第一个控制器:我声明了一些全局变量,用于两个视图控制器之间的连接。 import UIKit import SocketIOClientSwift import SwiftyJSON import CoreData //declare some global variable var patientCoreData = [NSManagedObject]()

根据标题,我在处理socket.io时遇到了一些问题。它在第一个视图控制器中连接得非常好,但在第二个控制器中会发生奇怪的事情

代码如下:

第一个控制器:我声明了一些全局变量,用于两个视图控制器之间的连接。

import UIKit
import SocketIOClientSwift
import SwiftyJSON
import CoreData

//declare some global variable
var patientCoreData = [NSManagedObject]()
var numberOfUsersExisting:Int = 0 //assign to 0 by default
var appUserData: Patient? //for specific user
var pSample: Array<Patient> = [] //for all user

//initiate socket globally
let socket = SocketIOClient(socketURL: "localhost:3000", options: [
    "reconnects": true
])

func reportStatus(){
    socket.on("connect") {data, ack in
        print("Report status: View Controller connected")
        socket.emit("click", "Client app connected")
    }
}

func readDataFromSocket(completion: (data:AnyObject)-> ()){
    socket.on("reply") {data, ack in
        print("database replied")
        completion(data: data)
    }//socket
}//readDataFromSOCKET

func importData(){
    reportStatus()
    socket.connect()
    readDataFromSocket(){ data in
        let json = JSON(data)
        let nou = json[0].count
        if nou > 0 {
            print("Test(1st VC): grabbing data from database")
            for var i=0; i<nou; ++i{
                numberOfUsersExisting = nou
                pSample += [Patient(id: json[0][i]["ID"].intValue, name: json[0][i]["Name"].stringValue, gender: json[0][i]["Gender"].stringValue, mileage: json[0][i]["Mileage"].doubleValue)]
            pSample.sortInPlace({$0.globalPatientMileAge < $1.globalPatientMileAge})
        }
        print("Successfully grabbed data")
    }else{
        print("No user in the database")
        numberOfUsersExisting = 0
    }
}//readDataFromSocket
}

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout{
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

}

override func viewDidLoad() {
    super.viewDidLoad()

}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    print("First view appeared")
    let prefs = NSUserDefaults.standardUserDefaults()

    //if an user has logged in
    let isLoggedIn = prefs.integerForKey("ISLOGGEDIN") as Int
    if (isLoggedIn != 1){
        print("No user currently, so heading to login screen")
        socket.disconnect()
        self.performSegueWithIdentifier("gotoLogin", sender: self)
    }else{
        print("ViewDidAppear: An user has been logged in")
        let permissionToLoadData = prefs.integerForKey("ISLOGGEDIN")

        if (permissionToLoadData != 1) {
            print("Please grant permission to get data")
        }else{
            print("First view: connecting to database")

            importData()

        }//permission to load data
    }
}//end of viewDidAppear

}
导入UIKit
导入SocketIOClientSwift
导入快捷JSON
导入CoreData
//声明一些全局变量
var patientCoreData=[NSManagedObject]()
var numberOfUsersExisting:Int=0//默认情况下分配给0
var appUserData:患者//针对特定用户
var pSample:Array=[]//适用于所有用户
//全局启动套接字
让socket=SocketIOClient(socketURL:localhost:3000),选项:[
“重新连接”:真
])
func reportStatus(){
socket.on(“connect”){data,ack in
打印(“报告状态:视图控制器已连接”)
socket.emit(“单击”,“客户端应用程序已连接”)
}
}
func readDataFromSocket(完成:(数据:AnyObject)->()){
socket.on(“reply”){data,ack in
打印(“数据库已回复”)
完成(数据:数据)
}//插座
}//readDataFromSOCKET
func importData(){
报告状态()
socket.connect()
readDataFromSocket(){中的数据
让json=json(数据)
设nou=json[0]。计数
如果nou>0{
打印(“测试(第一个VC):从数据库获取数据”)

对于VarI=0;经过几天的努力,我想我可能已经找到了正确的答案

最后,我定义了两个不同的套接字处理程序连接:

let loginSocket = SocketIOClient(socketURL: "localhost:3000")
let socket = SocketIOClient(socketURL: "localhost:3000", options: [
"reconnects": true
])
对于两个视图控制器

如果我能从这个难题中得出一个结论,那就是我们不能对来自不同视图控制器的套接字方法使用单个套接字处理程序

let loginSocket = SocketIOClient(socketURL: "localhost:3000")
let socket = SocketIOClient(socketURL: "localhost:3000", options: [
"reconnects": true
])