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 に答える