Alamofire 非阻塞连接

Alamofire nonblocking connection

我正在使用 Alamofire 进行基本联网。这是我的问题。我有一个class

class User {
    var name:String?
    var company:String

init () {
  //
   manager = Alamofire.Manager(configuration: configuration)
  }

 func details () {
    //first we login, if login is successful we fetch the result

 manager.customPostWithHeaders(customURL!, data: parameter, headers: header)
          .responseJSON { (req, res, json, error) in
              if(error != nil) {
                  NSLog("Error: \(error)")
            }
             else {
                 NSLog("Success: \(self.customURL)")
                 var json = JSON(json!)
                 println(json)
                     self.fetch()
                      println("I fetched correctly")
                 }
   }

func fetch() {

   manager.customPostWithHeaders(customURL!, data: parameter, headers: header)

            .responseJSON { (req, res, json, error) in
                if(error != nil) {
                    NSLog("Error: \(error)")
                }
                else {
                    NSLog("Success: \(self.customURL)")
                    var json = JSON(json!)
                    println(json)
            //set name and company
      }
   }
}

我的问题是如果我做类似

var my user = User()
user.fetch()
println("Username is \(user.name)")

我在 user.name 的控制台上没有得到任何信息。但是,如果我放置一个断点,我会看到我在 fetch 函数中正确获取了用户名和公司。我认为管理器在单独的非阻塞线程中运行并且不会等待。但是,如果我不知道 manager 是否成功完成,我真的不知道如何用正确的数据初始化我的 class。那么,在 Alamofire 管理器的所有线程完成工作后,如何正确初始化我的 class 以便立即访问?

您不想在模型对象内部进行网络连接。相反,您想在一些更抽象的对象中处理网络层,例如 Service 的 class 方法。这只是一个简单的示例,但我认为这确实会让您朝着更好的架构方向前进。

import Alamofire

struct User {
    let name: String
    let companyName: String
}

class UserService {

    typealias UserCompletionHandler = (User?, NSError?) -> Void

    class func getUser(completionHandler: UserCompletionHandler) {
        let loginRequest = Alamofire.request(.GET, "login/url")
        loginRequest.responseJSON { request, response, json, error in
            if let error = error {
                completionHandler(nil, error)
            } else {
                println("Login Succeeded!")

                let userRequest = Alamofire.request(.GET, "user/url")
                userRequest.responseJSON { request, response, json, error in
                    if let error = error {
                        completionHandler(nil, error)
                    } else {
                        let jsonDictionary = json as [String: AnyObject]
                        let user = User(
                            name: jsonDictionary["name"]! as String,
                            companyName: jsonDictionary["companyName"]! as String
                        )

                        completionHandler(user, nil)
                    }
                }
            }
        }
    }
}

UserService.getUser { user, error in
    if let user = user {
        // do something awesome with my new user
        println(user)
    } else {
        // figure out how to handle the error
        println(error)
    }
}

由于登录和用户请求都是异步的,因此在这两个请求都完成并且您拥有有效的用户对象之前,您无法开始使用用户对象。闭包是在异步任务完成后将逻辑捕获到 运行 的好方法。这里有一些关于 Alamofire 和异步网络的其他线程,它们也可能对您有所帮助。

  • Returning a Value with Alamofire

希望这能说明一些问题。