2015-08-11 15 views
9

Hallo alle als Titel Erwähnen Ich versuche, Daten von meinem Redis-Server in schneller Sprache zu senden und zu empfangen. Ich habe viel recherchiert und kann keine gute Antwort zu diesem Thema finden. Am nächsten komme ich zu NSStream oder ein paar Github-Projekte (die meisten davon mit kaputten Code), ich habe versucht, eine Lösung dafür zu erstellen 3 Tage jetzt, bitte jemand helfen.Verbinden mit Redis-Server mit NS Stream in Swift

Verbindung Voraussetzung für Redis Port :

  • TCP
  • Telnet (My Favorite)

Probleme:

  1. AppDelegate Crash-Gewinde 1: EXC_BAD_ACCESS(code=1, address=XXXXXXXX)MANCHMAL
  2. Keine Daten Rückkehr

Klasse mit Initialisierung (Redis): Die nächstgelegene ich auf ein Niveau bringen konnte, wo ich das Verfahren mit NSStream verstehen, aber auch dies ist nichts, was in meinem Dialog für die Rückkehr gedruckt wird, und ich kann nicht herausfinden, was falsch ist.

class Redis: NSObject, NSStreamDelegate { 

    //Intilizing Stream & Requirement 
    var endPoint: CFString? 
    var onPort: UInt32? 
    var inputStream: NSInputStream? 
    var outputStream: NSOutputStream? 

Server Connection Funktion:

func serverConnection(endPoint: CFString, onPort: UInt32){ 

     //Streams Init 
     let Host: CFString = endPoint 
     let Port: UInt32 = onPort 
     var readStream: Unmanaged<CFReadStream>? 
     var writeStream: Unmanaged<CFWriteStream>? 

     //Bind Streams to Host and Port 
     CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, Host, Port, &readStream, &writeStream) 

     //Cast CFStream to NSStreams 
     inputStream = readStream!.takeRetainedValue() 
     outputStream = writeStream!.takeRetainedValue() 

     //Assign Delegate 
     inputStream!.delegate = self 
     outputStream!.delegate = self 

     //Schadule Run-loop 
     inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 
     outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) 

     //Open Connection 
     inputStream!.open() 
     outputStream!.open() 


    } 

Stream: Sobald die App Mittagessen erhalte ich eine App delegieren Fehler MANCHMAL

Gewinde 1: EXC_BAD_ACCESS (code = 1, Adresse = XXXXXXXX)

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { 
     if aStream === inputStream { 
      switch eventCode { 
      case NSStreamEvent.ErrorOccurred: 
       //Print Available Errors 
       print("Error: \(aStream.streamError?.description)") 
       break 
      case NSStreamEvent.OpenCompleted: 
       //Connection Succeed 
       print("Connection Complete \(aStream.description)") 
       break 
      case NSStreamEvent.HasBytesAvailable: 
       //Server Respond 
       var buffer = [UInt8](count: 8, repeatedValue: 0) 
       while inputStream?.hasBytesAvailable != nil { 
        let result: Int = (inputStream?.read(&buffer, maxLength: buffer.count))! 
        print(result) 
        print(buffer) 
       } 
       break 
      default: 
       break 

      } 
     } 

     if aStream === outputStream { 
      switch eventCode { 
      case NSStreamEvent.ErrorOccurred: 
       //Print Available Errors 
       print("Error: \(aStream.streamError?.description)") 
       break 
      case NSStreamEvent.OpenCompleted: 
       //Connection Succeed 
       print("Connection Complete \(aStream.description)") 
       break 
      case NSStreamEvent.HasSpaceAvailable: 
       //Ready to Send more Dat 
       print("HasSpaceAvailable \(aStream.description)") 
       break 
      default: 
       break 

      } 
     } 

    } 

Server-Test mit Ping: die Rückkehr PONG

func Ping(){ 
    let Command: NSString = NSString(format: "Ping /n", String(endPoint)) 
    let data: NSData = NSData(data: Command.dataUsingEncoding(NSUTF8StringEncoding)!) 
    outputStream!.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length) 
} 

Antwort

3

Dank GCDAsyncSocket sein sollte, ich war in der Lage, eine Lösung für Redis Verbindung mit Swift 2 zu erstellen. Ich arbeite auch an Full-Set-Framework auf Github für Redis, wenn jemand am Download interessiert ist.

Redis Klasse: Sie müssen GCDAsyncSocketDelegate einschließen.

import Foundation 
class Redis: NSObject, GCDAsyncSocketDelegate { 

    //Alloc GCDAsyncSocket 
    var Socket: GCDAsyncSocket? 

    /*============================================================ 
    // Server Open Connection 
    ============================================================*/ 
    func server(endPoint: String, onPort: UInt16){ 

     //Check For Socket Condition 
     if !(Socket != nil) { 

      //Assign Delegeate to Self Queue 
      Socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 

     } 

     var err: NSError? 

     /*============================================================ 
     GCDAsyncSocket ConnectToHost Throw Error so you must handle 
     this with Try [Try!], do, Catch. 
     ============================================================*/ 

     do{ 
      //Assign Function Constants 
      try Socket!.connectToHost(endPoint, onPort: onPort) 
     }catch { 
      //Error 
      print(err) 
     } 

     //Read Send Data 
     Socket?.readDataWithTimeout(2, tag: 1) 
    } 


    //Server Confirmation 
    func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) { 
     print("Connected to Redis!") 
    } 

    /*============================================================ 
    // Read Data From Redis Server [NSUTF8StringEncoding] 
    ============================================================*/ 

    func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int) { 
     let Recieved: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! 
     print(Recieved) 
    } 

    /*=============================================================== 
    // Send Command [I Will create Full SET and Upload it to Github] 
    =================================================================*/ 

    func Command(Command: String){ 
     let request: String = Command + "\r\n" 
     let data: NSData = request.dataUsingEncoding(NSUTF8StringEncoding)! 
     Socket!.writeData(data, withTimeout: 1.0, tag: 0) 

    } 

} 

Anruf die Methoden durch eine Konstante der Klasse Redis entsteht.

let redisServer = Redis() 
redisServer.server("XX.XX.XXX.XXX", onPort: 6379) 
redisServer.Command("Ping") //Return Should be **PONG**