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

标签 ios swift sockets

我正在尝试获取来自套接字服务器端的数据,以便在我的应用程序(iOS)上读取。我设置了一个网络类,其中包括连接和获取输入函数。当我将 NetworkEnable() 函数放入 AppDelegate 文件中的 func application... 时,套接字会连接并且服务器会按照预期进行操作。但是,当我的 View Controller 中的代码到达 getPiIn() 函数时,该函数的第一行会出现 EXC_BAD_INSTRUCTIONS 错误。

网络类文件:

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

}

我的猜测是,由于流委托(delegate)是在不同的类中声明为 self 的,所以它们无法在 ViewController.swift 中访问,但是当我更改 .selfViewController View 永远不会加载。

还值得一提的是,当我将 network.NetworkEnable() 放在 ViewDidLoad() 中时,它可以正常工作,直到我离开该 View 并返回。

最佳答案

所以,如果我理解你只是想从服务器获取数据,那么请使用 URLSession().dataTask 方法 你使用InputStream OutputStream这是否是java方式? 如果您想获取通知,请使用 UNUserNotificationCenter 是在 swift 中与用户和服务器进行通信的正确方法

关于ios - 在 AppDelegate 中连接时获取套接字输入时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023276/

相关文章:

ios - xcode 9 中的 IBanimitable 问题?

Python socket.connect() 出错

python - 来回 unix 域套接字锁

ios - 搜索字符而不是单词 SWIFT

ios - 快速处理所有未处理的异常

iphone - 将数据从免费的 iOS 版本复制到我的应用程序的完整版本?

swift - 如何在 Swift 中针对 UILabel 和 UIImageView 类型分解 panGestureHandling 函数?

python-3.x - 如何在python中从服务器接收文件?

ios - 尝试使用 Watch OS 2 发送图像时出现 WCErrorDomain 7013

iphone - 如何将 NSString 中的所有字母大写?