2016-08-08 5 views
12

私はprotobuf v2 in Swiftを持っています。私はそれを別のprotobufに追加しようとしています。スイフトにプロトコルバッファを追加するには?

malloc: *** mach_vm_map(size=2749415424) failed (error code=3) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 

を多分それは私の読書が帰って:

let attachment = getAttachment(id: 987) //From cloud database 
var protosData = NSMutableData(data: attachment) 

items.forEach { //Some struct array of values 
    guard let proto = try? MyProtoBuf.Builder() 
     .setEpochMillis($0.date.epochMilliseconds) 
     .setValue($0.value) 
     .build() else { return } 

    protosData.appendData(proto.data()) 
} 

saveAttachment(protosData) //Store to cloud 

私がそれを読み戻すときに私はこのエラーを取得するので、私はデータを破損てるようだようだ:これは私がしようとしているものです値は、ここでは、間違っている私はストレージから追加されたデータを読み取るためにやってるものです:

extension GeneratedMessageProtocol { 

    static func getStreamData(data: NSData) -> [Self] { 
    var messages = [Self]() 
    do { 
     let inStream = NSInputStream(data:data) 
     inStream.open() 
     defer { inStream.close() } 
     while inStream.hasBytesAvailable { 
      var sizeBuffer: [UInt8] = [0,0,0,0] 
      inStream.read(&sizeBuffer, maxLength: sizeBuffer.count) 
      let data = NSData(bytes: sizeBuffer, length: sizeBuffer.count) 
      let messageSize = data.uint32.littleEndian 
      var buffer = Array<UInt8>(count: Int(messageSize), repeatedValue: 0) 
      inStream.read(&buffer, maxLength: Int(messageSize)) 
      let messageData = NSData(bytes: buffer, length:Int(messageSize)) 
      messages.append(try self.parseFromData(messageData)) 
     } 
    } 
    catch { 

    } 
    return messages 
    } 
} 

extension NSData { 

    var uint32: UInt32 { 
    get { 
     var number: UInt32 = 0 
     self.getBytes(&number, length: sizeof(UInt32)) 
     return number 
    } 
    } 
} 

そしてここでは、私のいるProtobufメッセージです

syntax = "proto2"; 

message MyProtoBuf { 
    optional uint64 epochMillis = 1; 
    optional uint32 value = 2; 
} 

既存のprotobufにデータを追加する正しい方法は、配列アイテムを1つずつ解析し、protobufを追加してから、配列全体をバイトに変換する必要はありませんか?

+0

おそらく区切り記号がありませんか? – TruMan1

答えて

5

あなたの読書部分は大丈夫です。 protoオブジェクトを連結するときにデリミタがありません。最初にストリームにデリミタを追加してからprotoオブジェクトを追加して追加します。各protoオブジェクトに対してそれを行います。

let attachment = getAttachment(id: 987)   //From cloud database 
var arr: [UInt32] = [UInt32(attachment.length)] //Assuming attachment is NSData type 
let delimiter = NSData(bytes: arr, length: arr.count * sizeof(UInt32)) 

let protosData = NSMutableData(data: delimiter) 
protosData.appendData(attachment) 

items.forEach {         //Some struct array of values 
    guard let proto = try? MyProtoBuf.Builder() 
     .setEpochMillis($0.date.epochMilliseconds) 
     .setValue($0.value) 
     .build() else { return } 

    var array: [UInt32] = [UInt32(proto.data().length)] 
    let delimit = NSData(bytes: array, length: arr.count * sizeof(UInt32)) 

    protosData.appendData(delimit) 
    protosData.appendData(proto.data()) 
} 

saveAttachment(protosData)      //Store to cloud 
+0

ありがとうございました!区切り文字の接頭辞としてバイトサイズを追加することが重要でした。 – TruMan1

関連する問題