2016-09-22 4 views
1

Also ich dies mit ein paar Daten zu kodieren ...NSCoding in swift 3.0 mit Multipeer Übertragungsfehler

func save2fileV3() -> String { 
    var newDBstrip:[Book] = [] 
    for blah in fnDB { 
     let newDBrec = Book(name: blah.fnName, link: blah.fnLink, age: blah.fnPos) 
     newDBstrip.append(newDBrec) 
    } 
    let directory = NSTemporaryDirectory() 
    let fileName = NSUUID().uuidString 
    let fileURL = directory.appending(fileName) 
    NSKeyedArchiver.archiveRootObject(newDBstrip, toFile: fileURL) 
    guard let encodedBook = NSKeyedUnarchiver.unarchiveObject(withFile: fileURL) as? [Book] else { return "" } 
    encodedBook.forEach({print($0.fileName, $0.fileLink, $0.filePos)}) 
    return fileURL 
} 

Es funktioniert, bon; so sende ich es über einen MultipeerConnectivity Link mit diesem ...

self.appDelegate.mpcHandler.session.sendResource(at: fileURL as URL, withName: fileSavedUnder, toPeer: self.appDelegate.mpcHandler.session.connectedPeers[0]) 

es Erhalten Sie auf dem anderen Host mit diesem ...

func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL, withError error: Error?) { 
    print("File finished \(localURL)") 

    do { 
     let localFS = try String(contentsOf: localURL) 
     let encodedBook = NSKeyedUnarchiver.unarchiveObject(withFile: localFS) as? [Book] 
     encodedBook.forEach({print($0.fileName, $0.fileLink, $0.filePos)}) 
    } catch { 
     print("conversion failed") 
    } 

} 

Aber es nicht zu entschlüsseln ... ich etwas fehlt hier , ein kleines Detail ... Ich weiß, dass die Datei senden Link funktioniert; Ich habe bereits eine Textdatei gesendet und sie erhalten. Aber ich versuche, dies ist der richtige Weg zu codieren, diese Bibliothek NSCoding mit ...

Hier ist der NSCoding Code noch nicht ganz aufgegeben ...

class Book: NSObject, NSCoding { 
let fileName: String 
let fileLink: String 
let filePos: String 
required init(name: String, link: String, age: String) { 
    self.fileName = name 
    self.fileLink = link 
    self.filePos = age 
} 
required init(coder decoder: NSCoder) { 
    self.fileName = decoder.decodeObject(forKey: "fileName") as? String ?? "" 
    self.fileLink = decoder.decodeObject(forKey: "fileLink") as? String ?? "" 
    self.filePos = decoder.decodeObject(forKey: "filePos") as? String ?? "" 
} 

func encode(with coder: NSCoder) { 
    coder.encode(fileName, forKey: "fileName") 
    coder.encode(fileLink, forKey: "fileLink") 
    coder.encode(filePos, forKey: "filePos") 
} 
} 

Antwort

1

So sparte ich mit dieser Datei ...

func save2file() -> String { 
    let directory = NSTemporaryDirectory() 
    let fileName = NSUUID().uuidString 
    let fileURL = directory.appending(fileName) 

    var bytesWritten = 0 
    if let outputStream = OutputStream(toFileAtPath: fileURL, append: true) { 
     outputStream.open() 
     for blah in fnDB { 
      let string2write = String(format: "%@,%@,%d\n", blah.fnLink , blah.fnName, blah.fnPos) 
      print(string2write) 
      outputStream.write(string2write,maxLength: string2write.lengthOfBytes(using: String.Encoding.utf8)) 
      bytesWritten = bytesWritten + string2write.lengthOfBytes(using: String.Encoding.utf8) 
     } 
     outputStream.close() 
     } 
    return fileURL 
    } 

bei Übertragen es ... und wieder mit diesem lesen ...

do { 
     let fullText = try String(contentsOf: localURL) 
     let lines = fullText.components(separatedBy: "\n") as Array 
     for blah in lines { 
      let field = blah.components(separatedBy: ",") as Array 
      if field.count == 3 { 
        sharedDataAccess.fnATV(fnName: field[1], fnLink: field[0], fnPos: Int(field[2])!) 
      } 
      sharedDataAccess.sorterPos() 
      sharedDataAccess.dump() 
     } 
    } catch { 
     print("fcuk2209 conversion failed") 
    } 

und es war weit weniger schmerzhaft als NSCoding ... :)