我将 Alamofire 用于基本网络。这是我的问题。我有课
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 是否成功完成,我真的不知道如何用正确的数据初始化我的类。那么,在 Alamofire 管理器的所有线程完成其工作后,如何正确初始化我的类以便立即访问?
最佳答案
您不想在模型对象内部进行网络连接。相反,您希望在一些更抽象的对象(例如类方法的 Service
)中处理网络层。这只是一个简单的示例,但我认为这确实会让您朝着更好的架构方向前进。
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 和异步网络的其他线程,它们也可能对您有所帮助。
希望这能说明一些问题。
关于swift - Alamofire 非阻塞连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28972847/