2016-11-24 2 views
0

Я хочу сохранить объект данных в MongoDB:Как хранить и извлекать данные Swift или NSData от MongoDB?

Он создан с использованием CryptoSwift

let bytes = dataString.utf8.map({$0}) 
let encrypted = try! ChaCha20(key: getAESP(), iv: "zzzzzzzzzzzzzz").encrypt(bytes) 
let encryptedData = Data(bytes: encrypted) 

и отправляется на сервер с помощью NSURLSession:

let postData = NSMutableData(data: "patient_id=\(patientID)".data(using: String.Encoding.utf8)!) 
postData.append("&data=".data(using: String.Encoding.utf8)!) 
postData.append(encryptedData)   
let request = NSMutableURLRequest(url: NSURL(string: "\(url)api/patient/document")! as URL, 
              cachePolicy: .useProtocolCachePolicy, 
              timeoutInterval: 10.0) 

В моей схеме модели я описал данные как Буфер:

var DocumentSchema1 = new Schema({ 
     created_at:Date, 
     created_by:String, 
     document_type:String, 
     document_name:String, 
     data: Buffer, 
     modifications: [ 
      { 
       modified_by: String, 
       modified_at: Date, 
       data: Buffer 
      } 
     ], 
     isDeleted: Boolean, 
     deleted_at: String, 
     deleted_by: String, 
    }) 

Проблема wi Этот подход заключается в том, что JSON, возвращаемый из веб-службы, является типом буфера, а не данными, а условие Swift ниже никогда не выполняется.

if let dataString = dict["data"] as? Data{ 

Вопрос в том, как вернуть двоичные данные из Монго и использовать их в Swift?

EDIT2: на основе ответа на zaph в: Так данные поступают в __NSArrayI с элементами Int64 (35) Единственный способ, которым я могу бросить это в Array<AnyObject>, но я не могу преобразовать его в данных, приведенных в этом виде.

Попытки привести его к:

  • Array<Int64>
  • [UInt64]
  • [Uint8]
  • [Int64]
  • UnsafeRawPointer

не удалось.

if let a = dataDict["data"] as? Array<Int64> 
+0

Подсказка: Если вы используете AES от общего Crypto от скорости шифрования с порядком величины быстрее. – zaph

+0

Попробуйте 'init (bytes: UnsafeRawPointer, count: Int)', чтобы создать объект Data из байтов. – zaph

+0

Как я могу получить UnsafeRawPointer? Проверьте обновленный вопрос. –

ответ

0

Предполагая dataString является массив байтов, который плохо называется:

let dataString :[UInt8] = [0x41, 0x42, 0x43, 0x44] 
print("dataString: \(dataString)") 
let data = Data(bytes:dataString, count:4) 
print("data: \(data)") 
print("data as hexadecimal: \(data.map { String(format: "%02hhx", $0) }.joined())") 

Выход:

dataString: [65, 66, 67, 68] 
data: 4 bytes 
data as hexadecimal: 41424344 
+0

Спасибо, заф. Я все еще борюсь с этим. Не могли бы вы взглянуть на мои последние изменения? Я не видел вашего ответа до сегодняшнего вечера, мои уведомления должны быть отключены. –

Смежные вопросы