1
ストリームイベントを取得した後にbutton
を更新できないようである点を除いて、以下のコードが機能するようです。Swift:ストリームをリッスンするときにUIを更新する方法
私はdelegate
とdispatch_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
}
}
}
}
これは素晴らしい仕事、ありがとうございました! – Jason