Ios 在AppDelegate中连接时获取套接字输入时出错
我正在尝试获取从套接字服务器端传入的数据,以便在我的应用程序(iOS)上读取。我已经设置了一个网络类,其中包括一个connect和一个get input函数。当我将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
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服务器,因此我的理解是,我必须使用当前使用的方法。