2016-09-22 45 views
1

所以我用这个编码的一些数据...NScoding在SWIFT 3.0 Multipeer传输错误

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 
} 

它的工作原理,苯教;所以我把它跨越与这个MultipeerConnectivity链接...

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

收到其他主机与此有关...

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") 
    } 

} 

但它无法解码...我失去了一些东西在这里,一个小细节...我知道发送文件链接的作品;我已经发送一个纯文本文件并收到它。但是我想这个正确的方式代码,使用该NSCoding库...

这里是NSCoding代码并没有放弃尚未...

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") 
} 
} 

回答

1

所以,我保存这个文件到...

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 
    } 

转移它...读回本...

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") 
    } 

它远不如疼痛比NSCoding ... :)