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{
西南