Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:如何在监听流时更新UI_Swift_Sockets - Fatal编程技术网

Swift:如何在监听流时更新UI

Swift:如何在监听流时更新UI,swift,sockets,Swift,Sockets,下面的代码似乎有效,但在获取流事件后,我似乎无法更新按钮 我尝试了委托和调度_async两种方法,但两种方法都没有奏效 我在这里错过了什么魔力 import UIKit class TestViewController: UIViewController { @IBOutlet weak var connectButton: UIBarButtonItem! @IBOutlet weak var stopButton: UIBarButtonItem! let so

下面的代码似乎有效,但在获取流事件后,我似乎无法更新按钮

我尝试了
委托
调度_async
两种方法,但两种方法都没有奏效

我在这里错过了什么魔力

import UIKit

class TestViewController: UIViewController {

    @IBOutlet weak var connectButton: UIBarButtonItem!
    @IBOutlet weak var stopButton: UIBarButtonItem!

    let socket = Socket()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func connectServer(sender: UIBarButtonItem) {
        socket.connect("10.0.0.1", port: 12345)
    }

    func setStopButtonState(state: String) {
        switch state {
        case "go":
            stopButton?.title = "STOP"
            break
        case "stop":
            stopButton?.title = "Start"
            break
        default:
            break
        }
    }
}

class Socket: NSObject, NSStreamDelegate {
    var inputStream: NSInputStream?
    var outputStream: NSOutputStream?

    func connect(host: String, port: Int) {
        NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputStream, outputStream: &outputStream)
        if inputStream != nil && outputStream != nil {
            inputStream!.delegate = self
            outputStream!.delegate = self
            inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
            outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
            inputStream!.open()
            outputStream!.open()
        }
    }

    func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
        if aStream === inputStream {
            switch eventCode {
            case NSStreamEvent.HasBytesAvailable:
                var inputBuffer = Array<UInt8>(count:2048, repeatedValue: 0)
                inputStream?.read(&inputBuffer, maxLength: 2048)
                TestViewController().setStopButtonState(String(bytes: inputBuffer, encoding: NSUTF8StringEncoding)!)
                break
            default:
                break
            }
        }
    }
}
导入UIKit
类TestViewController:UIViewController{
@iBButtonItem!
@IBVAR停止按钮:UIBarButtonItem!
让socket=socket()
重写func viewDidLoad(){
super.viewDidLoad()
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
@iAction func connectServer(发件人:UIBarButtonim){
插座连接(“10.0.0.1”,端口:12345)
}
func setStopButtonState(状态:字符串){
开关状态{
案例“go”:
停止按钮?.title=“停止”
打破
案例“停止”:
停止按钮?.title=“开始”
打破
违约:
打破
}
}
}
类套接字:NSObject、NSStreamDelegate{
var inputStream:NSInputStream?
var outputStream:NSOutputStream?
func connect(主机:字符串,端口:Int){
NSStream.getStreamsToHostWithName(主机、端口:端口、inputStream:&inputStream、outputStream:&outputStream)
如果inputStream!=nil&&outputStream!=nil{
inputStream!.delegate=self
outputStream!.delegate=self
inputStream!.scheduleInRunLoop(.mainRunLoop(),格式:NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(.mainRunLoop(),格式:NSDefaultRunLoopMode)
inputStream!.open()
outputStream!.open()
}
}
函数流(aStream:NSStream,handleEvent事件代码:NSStreamEvent){
如果aStream==inputStream{
开关事件代码{
案例nsstreamvent.hasbytes可用:
var inputBuffer=数组(计数:2048,重复值:0)
inputStream?.read(&inputBuffer,最大长度:2048)
TestViewController().setStopButtonState(字符串(字节:inputBuffer,编码:NSUTF8StringEncoding)!)
打破
违约:
打破
}
}
}
}

让套接字有一个回调,并在流有字节时调用它:

import UIKit

class TestViewController: UIViewController {

@IBOutlet weak var connectButton: UIBarButtonItem!
@IBOutlet weak var stopButton: UIBarButtonItem!

let socket = Socket()

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func connectServer(sender: UIBarButtonItem) {
    socket.connect("10.0.0.1", port: 12345)
    socket.changeWhenHasBytesAvailable = { str in
        // do change for the string
    }
}

func setStopButtonState(state: String) {
    switch state {
    case "go":
        stopButton?.title = "STOP"
        break
    case "stop":
        stopButton?.title = "Start"
        break
    default:
        break
    }
}
}

class Socket: NSObject, NSStreamDelegate {
var inputStream: NSInputStream?
var outputStream: NSOutputStream?
var changeWhenHasBytesAvailable: ((String)->())?

func connect(host: String, port: Int) {
    NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputStream, outputStream: &outputStream)
    if inputStream != nil && outputStream != nil {
        inputStream!.delegate = self
        outputStream!.delegate = self
        inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
        outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
        inputStream!.open()
        outputStream!.open()
    }
}

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
    if aStream === inputStream {
        switch eventCode {
        case NSStreamEvent.HasBytesAvailable:
            var inputBuffer = Array<UInt8>(count:2048, repeatedValue: 0)
            inputStream?.read(&inputBuffer, maxLength: 2048)
            //call it in main queue
            dispatch_async(dispatch_get_main_queue(), { 
                self.changeWhenHasBytesAvailable?(String(bytes: inputBuffer, encoding: NSUTF8StringEncoding)!)
            })
            break
        default:
            break
        }
    }
}
}
导入UIKit
类TestViewController:UIViewController{
@iBButtonItem!
@IBVAR停止按钮:UIBarButtonItem!
让socket=socket()
重写func viewDidLoad(){
super.viewDidLoad()
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
@iAction func connectServer(发件人:UIBarButtonim){
插座连接(“10.0.0.1”,端口:12345)
socket.changehenhasbytesavailable={str in
//你要换绳子吗
}
}
func setStopButtonState(状态:字符串){
开关状态{
案例“go”:
停止按钮?.title=“停止”
打破
案例“停止”:
停止按钮?.title=“开始”
打破
违约:
打破
}
}
}
类套接字:NSObject、NSStreamDelegate{
var inputStream:NSInputStream?
var outputStream:NSOutputStream?
var changeWhenHasBytesAvailable:((字符串)->())?
func connect(主机:字符串,端口:Int){
NSStream.getStreamsToHostWithName(主机、端口:端口、inputStream:&inputStream、outputStream:&outputStream)
如果inputStream!=nil&&outputStream!=nil{
inputStream!.delegate=self
outputStream!.delegate=self
inputStream!.scheduleInRunLoop(.mainRunLoop(),格式:NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(.mainRunLoop(),格式:NSDefaultRunLoopMode)
inputStream!.open()
outputStream!.open()
}
}
函数流(aStream:NSStream,handleEvent事件代码:NSStreamEvent){
如果aStream==inputStream{
开关事件代码{
案例nsstreamvent.hasbytes可用:
var inputBuffer=数组(计数:2048,重复值:0)
inputStream?.read(&inputBuffer,最大长度:2048)
//在主队列中调用它
dispatch\u async(dispatch\u get\u main\u queue(),{
self.changehenhasbytesavailable?(字符串(字节:inputBuffer,编码:NSUTF8StringEncoding)!)
})
打破
违约:
打破
}
}
}
}

让套接字有一个回调,并在流有字节时调用它:

import UIKit

class TestViewController: UIViewController {

@IBOutlet weak var connectButton: UIBarButtonItem!
@IBOutlet weak var stopButton: UIBarButtonItem!

let socket = Socket()

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func connectServer(sender: UIBarButtonItem) {
    socket.connect("10.0.0.1", port: 12345)
    socket.changeWhenHasBytesAvailable = { str in
        // do change for the string
    }
}

func setStopButtonState(state: String) {
    switch state {
    case "go":
        stopButton?.title = "STOP"
        break
    case "stop":
        stopButton?.title = "Start"
        break
    default:
        break
    }
}
}

class Socket: NSObject, NSStreamDelegate {
var inputStream: NSInputStream?
var outputStream: NSOutputStream?
var changeWhenHasBytesAvailable: ((String)->())?

func connect(host: String, port: Int) {
    NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputStream, outputStream: &outputStream)
    if inputStream != nil && outputStream != nil {
        inputStream!.delegate = self
        outputStream!.delegate = self
        inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
        outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode)
        inputStream!.open()
        outputStream!.open()
    }
}

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
    if aStream === inputStream {
        switch eventCode {
        case NSStreamEvent.HasBytesAvailable:
            var inputBuffer = Array<UInt8>(count:2048, repeatedValue: 0)
            inputStream?.read(&inputBuffer, maxLength: 2048)
            //call it in main queue
            dispatch_async(dispatch_get_main_queue(), { 
                self.changeWhenHasBytesAvailable?(String(bytes: inputBuffer, encoding: NSUTF8StringEncoding)!)
            })
            break
        default:
            break
        }
    }
}
}
导入UIKit
类TestViewController:UIViewController{
@iBButtonItem!
@IBVAR停止按钮:UIBarButtonItem!
让socket=socket()
重写func viewDidLoad(){
super.viewDidLoad()
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
@iAction func connectServer(发件人:UIBarButtonim){
插座连接(“10.0.0.1”,端口:12345)
socket.changehenhasbytesavailable={str in
//你要换绳子吗
}
}
func setStopButtonState(状态:字符串){
开关状态{
案例“go”:
停止按钮?.title=“停止”
打破
案例“停止”:
停止按钮?.title=“开始”
打破
违约:
打破
}
}
}
类套接字:NSObject、NSStreamDelegate{
var inputStream:NSInputStream?
var outputStream:NSOutputStream?
var changeWhenHasBytesAvailable:((字符串)->())?
func connect(主机:字符串,端口:Int){
NSStream.getStreamsToHostWithName(主机、端口:端口、inputStream:&inputStream、outputStream:&outputStream)
如果inputStream!=nil&&outputStream!=nil{
inputStream!.delegate=self
outputStream!.delegate=self
inputStream!.scheduleInRunLoop(.mainRunLoop(),格式:NSDefaultRunLoopMode)
outputStream!.scheduleInRunLoop(.mainRunLoop(),格式:NSDefaultRunLoopMode)
inputStream!.open()
outputStream!.open()
}
}
函数流(aStream:NSStream,handleEvent事件代码:NSStreamEvent){
如果aStream==inputStream{
西南