Ios 在AppDelegate中连接时获取套接字输入时出错

Ios 在AppDelegate中连接时获取套接字输入时出错,ios,swift,sockets,Ios,Swift,Sockets,我正在尝试获取从套接字服务器端传入的数据,以便在我的应用程序(iOS)上读取。我已经设置了一个网络类,其中包括一个connect和一个get input函数。当我将NetworkEnable()函数放入AppDelegate文件中的func应用程序…时,套接字连接,服务器按其应做的操作。但是,当my view controller中的代码到达getPiIn()函数时,函数的第一行出现EXC\u BAD\u指令错误 网络类文件: class Network: NSObject, StreamDel

我正在尝试获取从套接字服务器端传入的数据,以便在我的应用程序(iOS)上读取。我已经设置了一个网络类,其中包括一个connect和一个get input函数。当我将
NetworkEnable()
函数放入AppDelegate文件中的
func应用程序…
时,套接字连接,服务器按其应做的操作。但是,当my view controller中的代码到达
getPiIn()
函数时,函数的第一行出现
EXC\u BAD\u指令
错误

网络类文件:

class Network: NSObject, StreamDelegate {

//Socket server
let addr = "x.x.x.x"
let port = 2020

var inStream : InputStream?
var outStream: OutputStream?

var buffer = [UInt8](repeating: 0, count: 200)

func NetworkEnable() {

    Stream.getStreamsToHost(withName: addr, port: port, inputStream: &inStream, outputStream: &outStream)

    inStream?.delegate = self
    outStream?.delegate = self

    inStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
    outStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)

    inStream?.open()
    outStream?.open()

    buffer = [UInt8](repeating: 0, count: 200)


    print("Network Connected")

}

func stream(aStream: Stream, handleEvent eventCode: Stream.Event) {

    switch eventCode {
    case Stream.Event.endEncountered:
        print("EndEncountered")
        inStream?.close()
        inStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
        outStream?.close()
        print("Stop outStream currentRunLoop")
        outStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)

    case Stream.Event.errorOccurred:
        print("ErrorOccurred")

        inStream?.close()
        inStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
        outStream?.close()
        outStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)

    case Stream.Event.hasBytesAvailable:
        print("HasBytesAvailable")

        if aStream == inStream {
            inStream!.read(&buffer, maxLength: buffer.count)
            let bufferStr = NSString(bytes: &buffer, length:       buffer.count, encoding: String.Encoding.utf8.rawValue)

            print(bufferStr!)
        }

    case Stream.Event.hasSpaceAvailable:
        print("HasSpaceAvailable")

    case Stream.Event.openCompleted:
        print("OpenCompleted")

    default:
        print("Unknown")
    }
}

func getPiIn() -> String {
    inStream!.read(&buffer, maxLength: buffer.count) //Error Shows up here
    let bufferStr = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue)
    return(bufferStr!) as String
}
下面是对ViewController.Swift中的
getPi
的调用

func changeTemp() {

    let tempString = String(network.getPiIn())

    currentTemp.text = tempString

}
我的猜测是,由于流代理在不同的类中声明为self,因此无法在
ViewController.swift
中访问它们,但当我将
.self
更改为
ViewController
时,视图将永远不会加载


当我将
network.NetworkEnable()
放在
viewdiload()中时,它也值得一提,在我离开该视图并返回之前,它工作正常

因此,如果我理解您只想从服务器获取数据,那么请使用方法URLSession().dataTask 您是否使用InputStream OutputStream这是java方式? 如果要获取通知,请使用UNUserNotificationCenter
是在swift中与用户和服务器通信的正确方式,正如Paulw11所指出的,当调用
getPiIn()
时,
inStream
的值为
nil
,因为现在的代码和函数的调用方式相同。通过添加
static let shared=Network()
到network类的开头,并将该类中的所有函数作为
network.shared.function
在所有文件中调用,这样可以防止值返回
nil

您在流中强制展开
但由于网络操作的异步性质,您很可能正在调用
getPiIn
在建立网络连接之前。我建议您在网络连接后,让您的网络代码发布一个
通知
,并让您的视图控制器订阅此通知。我尝试了此操作,但无效。还值得一提的是,只有在网络连接后,视图才会加载,而当视图加载时,即出现错误时,您强制展开的内容是
nil
;这绝对是一次撞车。首先将其更改为条件展开;这将消除崩溃,然后您需要确定为什么该值为
nil
它是
流内
的值为
nil
,但现在我似乎不明白为什么。当在视图控制器中调用所有内容时,该函数工作正常。但是,当在应用程序启动时调用一个或两个时,该值变为
nil
,这对我来说毫无意义。服务器是python服务器,因此我的理解是,我必须使用当前使用的方法。