2

终于有时间在这里问我的第一个问题了!

前期: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 我知道这个网站上的格式是相当“严格”的,任何我错过的、过度的等等,请让我知道 :)

4

1 回答 1

7

我已经解决了。

首先:

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

于 2015-12-23T23:09:27.467 回答