2015-04-28 21 views
7

Xin lỗi nếu câu hỏi của tôi không rõ ràng, tôi sẽ cố gắng giải thích rõ ràng. Vì vậy, đây là chính xác những gì tôi đang cố gắng làm, tôi đang cố gắng sử dụng Alamofire để đăng nhiều hơn một bình luận (Một cái gì đó mà ứng dụng của tôi thực hiện và sẽ được lưu trữ như một đối tượng JSON bất cứ khi nào người dùng viết bình luận mới). Tôi đang chuyển các nhận xét JSON này tới thường trình bài viết của mình, nơi tôi có thể sử dụng SwiftyJSON để trích xuất từng giá trị. Noe điều là tôi biết làm thế nào để thiết lập các thông số nếu tôi đang cố gắng để ủy quyền cho người dùng như sau,ĐĂNG nhiều đối tượng json trong phương thức POST của Alamofire - Swift/IOS

var parameters = [ 
    "userName": userName, 
    "password": passwordSalt, 
    "somethingElse": somethingElse 
    ] 
    var err: NSError? 
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(parameters , options: nil, error: &err) 

nó khá straighforward đến đây, bây giờ đến vấn đề của tôi. Tôi đang cố gắng sử dụng alamofire đường bưu điện đến gửi nhiều đối tượng json, mà nên trông như thế này

[ 
    { 
    "comment": "my First Comment", 
    "commentDate": "2014-05-13 14:30 PM", 
    "isSigned": 1, 
    "patientId": 2, 
    "documentId": 3 
    }, 
    { 
    "comment": "my SecondComment", 
    "commentDate": "2014-05-14 14:30 PM", 
    "isSigned": 2, 
    "patientId": 3, 
    "documentId": 4 
    }, 
    { 
    "comment": "my third Comment", 
    "commentDate": "2014-05-15 14:30 PM", 
    "isSigned": 3, 
    "patientId": 4, 
    "documentId": 5 
    } 
] 

Làm thế nào để tôi tạo ra trên mảng/json (tôi không chắc chắn chính xác về những gì gọi này) bằng cách đối tượng JSON lặp lại. Tôi biết cách lấy các giá trị JSON từ đối tượng JSON tất cả những gì tôi hỏi là cách tạo thông số này để giữ dữ liệu như ví dụ trên. Thậm chí có thể thực hiện điều này bằng cách sử dụng Alamofire không? (POST nhiều đối tượng cùng một lúc)

tôi đã cố gắng vài cách để nhưng họ đã không làm việc ra

  1. var dictArray = [từ điển] var dict = từ điển

    Trong khi iterating trên Đối tượng JSON chèn mỗi giá trị vào dict và nối thêm dict đến dictArray, bây giờ khi tôi đang cố sử dụng dictArray làm tham số trong .dataWithJSONObject nó d không thích đối tượng.

  2. var dict = từ điển var array = NSArray()

    chiết xuất mỗi giá trị bằng cách duyệt qua các đối tượng JSON và chèn chúng vào dict và cố gắng chèn dict vào mảng. Nhưng điều này mang lại một vấn đề khác. Cách nó xây dựng các đối tượng khác với những gì được yêu cầu, như sau.

    [ { bình luận: Bình luận đầu tiên của tôi, commentDate: 2015/05/13 13:30 PM "", isSigned: 1, patientId: 2, documentId: 3 }, { bình luận : bình luận thứ hai của tôi, commentDate: 2015/05/13 13:30 PM "", isSigned: 2, patientId: 5, documentId: 4 }, { bình luận: bình luận thứ ba của tôi, commentDate: 2015 -06-13 13:30 CH "", là igned: 5, patientId: 1, documentId: 9 } ]

    Ở đây Phím không được bao bọc bên trong dấu ngoặc kép (Cách thực hiện: "bình luận", một cách sai lầm: bình luận).

Có ai cố gắng đăng nhiều đối tượng không, alamofire có khả năng làm như vậy không? Tôi hy vọng tôi đã đặt câu hỏi rõ ràng. Xin lỗi nếu câu hỏi này quá đơn giản để trả lời, tôi đã dành cả ngày để tìm hiểu điều này, nhưng không thành công. Cảm ơn bạn

Trả lời

5

Các đại diện chính xác trong Swift cho mảng các đối tượng bình luận bạn đã gửi sẽ là như thế này:

let comments: Array<[String:AnyObject]> = [ 
     [ 
      "comment": "my First Comment", 
      "commentDate": "2014-05-13 14:30 PM", 
      "isSigned": 1, 
      "patientId": 2, 
      "documentId": 3 
     ], 
     [ 
      "comment": "my SecondComment", 
      "commentDate": "2014-05-14 14:30 PM", 
      "isSigned": 2, 
      "patientId": 3, 
      "documentId": 4 
     ], 
     [ 
      "comment": "my third Comment", 
      "commentDate": "2014-05-15 14:30 PM", 
      "isSigned": 3, 
      "patientId": 4, 
      "documentId": 5 
     ] 
    ] 

Gửi một bình luận duy nhất sẽ là khá đơn giản:

let comment: [String:AnyObject] = [ 
     "comment": "my First Comment", 
     "commentDate": "2014-05-13 14:30 PM", 
     "isSigned": 1, 
     "patientId": 2, 
     "documentId": 3 
    ] 

    Alamofire.request(.POST, "http://httpbin.org/post", parameters: comment).responseJSON { (req, res, json, error) in 
     println(req) 
     println(res) 
     println(json) 
     println(error) 
    } 

Tuy nhiên, để gửi một loạt các nhận xét, có vẻ như bạn sẽ phải tạo URLRequest tự của bạn và sau đó chuyển nó tới Alamofire như sau:

let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "http://httpbin.org/post")!) 
    mutableURLRequest.HTTPMethod = "POST" 
    var error: NSError? = nil 

    let options = NSJSONWritingOptions.allZeros 
    if let data = NSJSONSerialization.dataWithJSONObject(comments, options: options, error: &error) { 
     mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 
     mutableURLRequest.HTTPBody = data 
    } 

    Alamofire.request(mutableURLRequest).responseJSON { (req, res, json, error) in 
     println(req) 
     println(res) 
     println(json) 
     println(error) 
    } 

Nếu bạn có thể thay đổi phụ trợ API để chấp nhận một đối tượng với nhiều ý kiến, bạn cũng có thể gửi cho họ theo cách này:

Alamofire.request(.POST, "http://httpbin.org/post", parameters: ["comments": comments]).responseJSON { (req, res, json, error) in 
     println(req) 
     println(res) 
     println(json) 
     println(error) 
    } 

trọng.

+0

Tôi hiện đang rời khỏi hệ thống của mình, tôi sẽ làm việc này bất cứ khi nào tôi có thể và cho bạn biết. Cảm ơn thời gian của bạn @Eneko :) – Sashi

-2

Tôi gặp sự cố tương tự trong dự án của mình khi làm việc với API hiện đã cho phép đăng nhiều đối tượng cùng một lúc. Định dạng của mảng như đã nói ở trên là tốt.

let comments: Array<[String:AnyObject]> = [ 
     [ 
      "comment": "my First Comment", 
      "commentDate": "2014-05-13 14:30 PM", 
      "isSigned": 1, 
      "patientId": 2, 
      "documentId": 3 
     ], 
     [ 
      "comment": "my SecondComment", 
      "commentDate": "2014-05-14 14:30 PM", 
      "isSigned": 2, 
      "patientId": 3, 
      "documentId": 4 
     ], 
     [ 
      "comment": "my third Comment", 
      "commentDate": "2014-05-15 14:30 PM", 
      "isSigned": 3, 
      "patientId": 4, 
      "documentId": 5 
     ] 
    ] 

Sau đó, tôi đã sử dụng vòng lặp for để đăng từng đối tượng của mảng để đăng API.

var index = comments.count 
    var i = 0 

    for i = 0; i < index; i++ { 

     let urlString = "\(.baseURL)...etc" 

     let parameters = comments[i] 

     Alamofire.request(.POST, urlString, parameters: parameters) 

      .responseJSON { (req, res, data, error) -> Void in 

//     println(req) 
//     println(res) 
//     println(data) 
//     println(error) 

       println("\(i) of \(index) posted") 
     } 
    } 

Các cách hiệu quả hơn nếu API cho phép, nhưng nếu không luồng này hoạt động tốt.

+2

wow, đó là những gì tôi gọi là mã không hiệu quả! – datayeah

+0

@datayeah - Điều gì không hiệu quả? Có cái gì tốt hơn ?? – hegranes

+1

bạn đang thực hiện 1 yêu cầu http cho mỗi nhận xét. đó là cách hiệu quả hơn để đăng tất cả các bình luận trong một yêu cầu duy nhất. – datayeah

Các vấn đề liên quan