我正在尝试获取来自套接字服务器端的数据,以便在我的应用程序(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
中访问,但是当我更改 .self
到 ViewController
View 永远不会加载。
还值得一提的是,当我将 network.NetworkEnable()
放在 ViewDidLoad()
中时,它可以正常工作,直到我离开该 View 并返回。
最佳答案
所以,如果我理解你只是想从服务器获取数据,那么请使用 URLSession().dataTask 方法 你使用InputStream OutputStream这是否是java方式? 如果您想获取通知,请使用 UNUserNotificationCenter 是在 swift 中与用户和服务器进行通信的正确方法
关于ios - 在 AppDelegate 中连接时获取套接字输入时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023276/