CFStreamCreatePairWithSocketToHost неожиданно завершает работу со Swift
Наконец-то пришло время задать мой первый вопрос здесь!
Фронт: Xcode 7.1.1, OS 10.11.2, iOS 9.0.2 (на физическом устройстве)
Я пишу небольшое приложение, которое связывается с моим Raspberry Pi. У меня есть некоторый рабочий код, написанный на Obj-C (для iOS 7), заимствованный из руководства, и все это прекрасно работает для меня в Obj-C (подключается и ведет себя так, как ожидается с Pi). Проблема заключается в том, чтобы переписать его для Swift/iOS 9 (что и является целью).
Хорошая часть:
func initNetworkCommunication() {
var readStream: Unmanaged<CFReadStreamRef>?
var writeStream: Unmanaged<CFWriteStreamRef>?
CFStreamCreatePairWithSocketToHost(nil, "192.168.1.22", 777, &readStream, &writeStream)
inputStream = readStream?.takeRetainedValue() as! NSInputStream
outputStream = writeStream?.takeRetainedValue() as! NSOutputStream
inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
inputStream.open()
outputStream.open()
}
Я полагаю, что проблема заключается в вышесказанном, так как это последний вызов метода в стеке, однако приложение тихо падает с небольшим количеством информации:
Любая помощь приветствуется!
Пожалуйста, не стесняйтесь спрашивать дополнительную информацию.
ps я понимаю, что форматирование на этом сайте довольно "строгое", все, что я пропустил, переусердствовал и т. д., пожалуйста, дайте мне знать:)
1 ответ
Я решил это.
Во-первых:
inputStream = readStream?.takeRetainedValue() as! NSInputStream
outputStream = writeStream?.takeRetainedValue() as! NSOutputStream
Должно быть:
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
Во-вторых, я абстрагировал соединение из ViewController (где у меня был этот метод изначально) с новым классом под названием Connection.
Вот соединение:
import UIKit
class Connection: NSObject, NSStreamDelegate {
var inputStream: NSInputStream!
var outputStream: NSOutputStream!
func connect() {
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil, "192.168.1.22", 777, &readStream, &writeStream)
self.inputStream = readStream!.takeRetainedValue()
self.outputStream = writeStream!.takeRetainedValue()
self.inputStream.delegate = self
self.outputStream.delegate = self
self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
self.inputStream.open()
self.outputStream.open()
}
}
Часто я нахожу, что начало печатать это помогает мне: p