2016-10-29 1 views
0

Как я понимаю, один из способов сделать это - использовать JSON. Но было бы проще и проще просто отправить быстрый объект на сервер, чтобы сервер имел тот же доступный класс. Таким образом, я могу просто использовать быстрый шаг на каждом шагу.Можно обменивать объекты между приложением Swift и бэкэнд?

Возможно ли это, и как я могу это сделать?

Текущая установка:

  1. Swift площадка для передачи данных.
  2. Kitura сервер для приема данных.

код Детская площадка:

import UIKit 
import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

struct TestObject { 
    let foo = "just a string" 
    let number = 125 
    let array = ["bar", "foo"] 

    func printSomeInfo() { 
     print(foo + "\(number+25)") 
    } 
} 

func send() { 
    let request = NSMutableURLRequest(url: URL(string: "http://192.168.178.80:8090/test")!) 
    request.httpMethod = "POST" 

    let testObject = TestObject() 

    let bodyData = "\(testObject)" 
    request.httpBody = bodyData.data(using: String.Encoding.utf8) 

    let task = URLSession.shared.dataTask(with: request as URLRequest, 
              completionHandler: { 
              (data, response, error) -> Void in 

    }) 

    task.resume() 
} 

send() 

Kitura код main.swift:

import Kitura 
import Foundation 

let router = Router() 

struct TestObject { 
    let foo = "just a string" 
    let number = 125 
    let array = ["bar", "foo"] 

    func printSomeInfo() { 
     print(foo + "\(number+25)") 
    } 
} 

router.post("/test") {request, response, next in 
    response.headers["Content-Type"] = "text/plain; charset=utf-8" 

    if let post = try request.readString() { 
     // would like to cast to TestObject but that doesn't work 
     // let postObject = post as TestObject 
     print(post) 
    } 
} 

Kitura.addHTTPServer(onPort: 8090, with: router) 
Kitura.run() 
+1

Вам нужно каким-то образом закодировать объект, чтобы отправить его по сети, даже если у вас есть Swift с обеих сторон, так как вы не можете просто отправить кусок памяти. Если вы не хотите использовать JSON, буферы протокола - это опция, но поддержка Swift еще рано; https://github.com/apple/swift-protobuf – Paulw11

+0

Возможно, мне не хватает понимания уровня объектов, но не существует способа передать состояние объекта, а затем сохранить его как объект снова на сервере? Когда я отправляю объект в виде строки, сервер печатает: TestObject (foo: «просто строка», число: 125, array: ["bar", "foo"]) Не удалось восстановить объект из этого информация на стороне сервера? – Jeffrey

+0

Вы не можете просто отправлять сырые байты по сети - заданный набор байтов может быть строкой или целым значением или ссылкой на объект, и это последнее особенно сложно, так как адреса памяти будут совершенно разными на разных устройствах; поэтому вам нужно использовать какой-то формат для сериализации информации, чтобы два конца могли четко общаться. В вашем примере кода вы используете метод 'description' для« отправки »вашего тестового объекта, и, хотя это« встроенный », нет встроенного способа анализа этого объекта обратно и никакого стандарта для того, что« описание » возвращается. – Paulw11

ответ

1

Вы должны были бы сериализовать данные каким-то образом через провода. Один из самых распространенных способов сделать это - использовать JSON. This recent swift blog объясняет, как вы можете это сделать. Если вам нужно сделать это для множества разных объектов, вы можете абстрагировать сериализацию/десериализацию JSON на общую базу.

0

Для вашей ситуации есть хорошая библиотека для отображения объекта JSON. https://github.com/Hearst-DD/ObjectMapper Однако, вам понадобится дополнительный код в классах и структурах для реализации их способность быть сопоставлен

+0

Это похоже на хороший способ использования JSON, и если я решит пойти по этому маршруту, я обязательно его проверю. Но это создает больше накладных расходов, чем я стремился, поэтому пока я буду продолжать искать. Возможно, то, что я надеюсь, просто невозможно (пока). (также, я бы проголосовал за ваш ответ, но у меня пока нет репутации, это мой первый вопрос :)) – Jeffrey

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