2017-03-03 4 views
3

Ich muss Bilder aus der Fotobibliothek über den Draht senden - in Stücke von 5 MB.Teilen von Daten in Stücke in Swift 3

Ich lese ein Bild aus der Bibliothek mit: PHImageManager.requestImageData (für: Optionen: resultHandler :) und ein Datenobjekt zu bekommen. Ich möchte dann die Daten effizient in Stücke teilen (ohne den Speicher zu kopieren). Was wäre der beste Weg, das zu tun?

Dies ist, was ich bisher:

imageData.withUnsafeBytes { (unsafePointer: UnsafePointer<UInt8>) -> Void in 

     let totalSize = data.endIndex 
     var offset = 0 

     while offset < totalSize { 
      let chunkSize = offset + uploadChunkSize > totalSize ? totalSize - offset : uploadChunkSize 
      let chunk = Data(bytesNoCopy: unsafePointer, count: chunkSize, deallocator: Data.Deallocator.none) 

      // send the chunk... 

      offset += chunkSize 
     } 
    } 

Jedoch habe ich diesen Fehler bei der Kompilierung erhalten:

Wert kann nicht vom Typ ‚UnsafePointer‘ zu erwarteten Argumenttyp ‚UnsafeMutableRawPointer‘ konvertieren

Wenn ich mutableBytes:

data.withUnsafeMutableBytes { (unsafePointer: UnsafeMutablePointer<UInt8>) -> Void in... } 

Dann erhalte ich die compi le-Zeitfehler:

Kann nicht auf unveränderlichen Wert verwenden mutiert Mitglied: ‚data‘ ist ein ‚lassen‘ konstant

Was ist richtig, da ich wirklich nicht zu Änderungen an den Bilddaten wollen. Ich möchte nur einen Teil davon auf einmal senden.

Gibt es einen besseren Weg, dies zu tun?

+0

wäre schön, wenn Sie Ihre Lösung markieren. Vielen Dank – John

Antwort

4

dort Hallo!

Ich brauche das gleiche Verhalten und kam mit dieser Lösung. Sie haben den Fehler richtig angegeben und die Lösung besteht darin, den UnsafeMutableRawPointer mit der UnsafePointer-Adresse zu erstellen. Es ist die schnellste Lösung, die ich bisher gefunden habe.

Eine andere Sache ist, den Offset der Basisadresse des mutRawPointer hinzuzufügen, wenn Sie einen Chunk erstellen.

50MB Daten in 2MB Brocken nimmt ~ 0.009578s

func createChunks(forData: Data) { 

    imageData.withUnsafeBytes { (u8Ptr: UnsafePointer<UInt8>) in 
     let mutRawPointer = UnsafeMutableRawPointer(mutating: u8Ptr) 
     let uploadChunkSize = 2097152 
     let totalSize = imageData.count 
     var offset = 0 

     while offset < totalSize { 

      let chunkSize = offset + uploadChunkSize > totalSize ? totalSize - offset : uploadChunkSize 
      let chunk = Data(bytesNoCopy: mutRawPointer+offset, count: chunkSize, deallocator: Data.Deallocator.none) 
      offset += chunkSize 
     } 
    } 
} 
0

Der Initialisierer erfordert einen veränderbaren Zeiger. Ändern Sie Ihren Code auf die folgenden, damit es funktioniert:

imageData.withUnsafeMutableBytes { (unsafePointer: UnsafeMutablePointer<UInt8>) -> Void in 
    // your code 
}