【问题标题】:Json Api Manager in Swift [duplicate]Swift中的Json Api Manager [重复]
【发布时间】:2015-07-29 16:46:39
【问题描述】:

您好,我目前正在使用 Swift 开发 Api Manager,到目前为止我得到了什么:

import Foundation
import CoreData
import Alamofire
import SwiftyJSON

class ApiManager {

    var data: NSArray = []

    func getApi() -> NSArray {

        let user:String = "user"
        let password:String = "password"

        Alamofire.request(.GET, "http://localhost/api/")
            .authenticate(user: user, password: password)
            .responseJSON{ (request, response, jsonData, error) in

                if let jsonData1 = jsonData {

                    if let jsonData2 = JSON(jsonData1).dictionaryObject {

                        self.data = jsonData2["data"] as! NSArray

                    }

                }

        }

        return data

    }

}

JSON Api 是正确的,但我的 swift 代码有问题,但我不确定它是什么,

当我打电话给这位经理时:

let response = ApiManager().getApi()
println(response)

我只是得到空括号:

(
)

有人可以帮我吗?

【问题讨论】:

  • 您的请求是异步的。所以你不能那样返回数据。
  • 你能帮我吗??

标签: json swift api


【解决方案1】:

这是一个错误的设计。你不应该这样做。您的 getApi() 方法应该有一个成功块,如果响应成功,它将被执行。这是一种可能的解决方案:

static func getApi(success:( (data:NSArray) -> () )) {

    let user:String = "user"
    let password:String = "password"

    Alamofire.request(.GET, "http://localhost/api/")
        .authenticate(user: user, password: password)
        .responseJSON{ (request, response, jsonData, error) in

            if let jsonData1 = jsonData {

                if let jsonData2 = JSON(jsonData1).dictionaryObject {

                    success(jsonData2 as! NSArray)

                }

            }

    }

    return data

}

因此,如果您想打印响应,您将执行以下操作:

APIManager.getApi {
 println($0)
}

【讨论】:

    【解决方案2】:

    使用 URLSession 你可以像这样编写你的 APIManager 类

    import UIKit
    import SwiftyJSON
    
    class APIManager: NSObject {
    
        let baseURL = "https://jsonplaceholder.typicode.com"
        static let sharedInstance = APIManager()
        static let getPostsEndpoint = "/posts/"
    
        func getPostWithId(postId: Int, onSuccess: @escaping(JSON) -> Void, onFailure: @escaping(Error) -> Void){
            let url : String = baseURL + APIManager.getPostsEndpoint
            let request: NSMutableURLRequest = NSMutableURLRequest(url: NSURL(string: url)! as URL)
            request.httpMethod = "GET"
            print("Request ",request)
            let session = URLSession.shared
            let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in
                if(error != nil){
                    onFailure(error!)
                } else{
                    do {
                        let data = try JSON(data: data!)
                        print("\n Success data ",data)
                        onSuccess(data)
                    } catch let error as NSError {
                        print("Error ",error)
                    }
                }
            })
            task.resume()
        }
    }
    

    // 并在控制器中使用写定义来进行 api 调用和响应,如下所示

    func getGETAPIData(){
            APIManager.sharedInstance.getPostWithId(postId:1, onSuccess: { json in
                DispatchQueue.main.async {
                    print("data in list view:",String(describing: json))
                }
            }, onFailure: { error in
                print("error2 :")
            })
        }
    

    // 并将此方法称为

    self.getGETAPIData()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多