2016-11-24 123 views
1

我在Swift 3中使用StreamDelegate連接到Java套接字時遇到了問題。我目前正在重寫一個大型Objective C項目,其中這段代碼像魅力一樣運行,但我似乎無法讓它在Swift 3中工作。我遇到的問題是流功能從不運行。所以「流」!從不打印出來。 self.outputStream.open()之後的Stream.Status被稱爲1(開放)。代碼運行時沒有任何問題,並且「打開線程上的流:」被調用。Swift 3輸入流和輸出流連接但沒有流

我試圖連接到的套接字是一個Java套接字。

注:我已經體驗到調試器打印出一條消息,說沒有附加處理程序,但我不知道它是相關的。

我發現了一些類似的帖子,但沒有在這個確切的問題。如果有人有任何想法,我會很高興聽到他們!感謝任何想要幫助的人。

import Foundation 

@objc class SocketConnector : NSObject, StreamDelegate { 
    var inputStream : InputStream! 
    var outputStream : OutputStream! 

    var lock : NSRecursiveLock 

    override init() { 
     lock = NSRecursiveLock.init() 
    } 

func connect (host : String, port : Int) -> Bool { 
    lock.lock() 
    var readStream : Unmanaged<CFReadStream>? 
    var writeStream : Unmanaged<CFWriteStream>? 

    CFStreamCreatePairWithSocketToHost(nil, host as CFString!, UInt32(port), &readStream, &writeStream) 

    inputStream = readStream!.takeRetainedValue() 
    outputStream = writeStream!.takeRetainedValue() 

    self.inputStream.delegate = self 
    self.outputStream.delegate = self 

    self.inputStream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode) 
    self.outputStream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode) 

    self.inputStream.open() 
    self.outputStream.open() 

    print("Opening streams on thread: %@", Thread.current) 

    lock.unlock() 

    return true 
} 

func stream (aStream : Stream, handleEvent eventCode : Stream.Event) { 
    print("Stream!") 
    switch eventCode { 
    case Stream.Event.hasBytesAvailable: 
     print("Stream has bytes:"); 
     break; 
    case Stream.Event.errorOccurred: 
     print("Stream error occurred: %@",aStream.streamError?.localizedDescription) 
    case Stream.Event.openCompleted: 
     print("Stream has bytes:") 
     break 
    case Stream.Event.endEncountered: 
     print("Stream ended") 
     self.closeStreams() 
     break 
    default: 
     break 
    } 
} 

回答

2

您的工具與StreamDelegate的stream方法不兼容。 您必須改成這樣:

FUNC流(_ aStream:流,處理EVENTCODE:Stream.Event)

,而不是

FUNC流(aStream:流,爲handleEvent eventCode:Stream.Event

+0

謝謝,你好!這個錯誤從來沒有發生過,我習慣於編譯器清理這樣的事情。現在完美! – andeey