我试图将Alamofire
请求结果分配给TableView
类变量。
我已经意识到,当我在Alamofire
请求块中使用self.notifications变量时,它可以工作。但是,当我在Alamofire
之外调用self.notifications时,它为nil,并且self.notifications未被引用分配。好像是一个复制变量
class NotificationsTableView: UITableViewController{
var notifications: Notification!
let uri = Helper.URLDEV + "/api_x/notifications/"
override func viewDidLoad() {
super.viewDidLoad()
tableView.cellLayoutMarginsFollowReadableWidth = true
self.tableView.delegate = self
self.tableView.dataSource = self
print("Table loaded")
let auth_code = ["Authorization": "Token " + Helper.getMyToken() ]
Alamofire.request(self.uri, parameters: nil, encoding: URLEncoding.default, headers: auth_code).responseJSON { response in
guard let data = response.data else { return }
do {
let decoder = JSONDecoder()
//This is working properly
self.notifications = try decoder.decode(Notification.self, from: data)
print(self.notifications?.results?[2].notificationData?.body ?? 999)
} catch let error {
print(error)
}
}
print("URI: \(uri)")
//Here is just nil, if I didn't assign a value before
print(self.notifications == nil)
我希望在Alamofire
请求之后,self.notifications不会为空
答案 0 :(得分:2)
当从URL接收到某些响应时,将执行alamofire响应中的代码。在这里,执行指针将不等待该响应,因为它是异步回调,并且将继续执行下一条语句。因此,它将首先在Alamofire外部执行该语句,并且由于未使用任何值对其进行初始化,因此它将为nil,并且在收到某些响应后,会将一些值分配给类变量。
下面的链接将使您了解异步代码
https://medium.com/ios-os-x-development/managing-async-code-in-swift-d7be44cae89f
答案 1 :(得分:0)
最后,使用repo中的Alamofire同步甚至使用更简洁的代码也可以解决问题。