Class 适当的未在 swift 中分配
Class proper not assigned in swift
我正在练习,发现我的 class 属性(adNames) 无法分配。但是可以在外面赋值(我注释掉的地方)。这是我的代码:
import UIKit
import Alamofire
import SwiftyJSON
class AdTableViewController: UITableViewController {
var adNames: [JSON]?
override func viewDidLoad() {
super.viewDidLoad()
Alamofire.request(.GET, "http://codewithchris.com/code/afsample.json").responseJSON { (Response) -> Void in
if let value = Response.result.value{
let json = JSON(value)
print(json["secondkey"].arrayValue) //["item1","item2","item3"]
self.adNames = json["secondkey"].arrayValue
}
}
// self.adNames = ["item1", "item2", "item3"]
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let names = adNames {
return names.count
}
return 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
...
}
}
谁能告诉我原因吗?谢谢!
您正在传递给请求调用的闭包中访问 self。在闭包内使用捕获列表来保存对 self 对象的引用。
[weak self] (Response)
-> Void in(在这种情况下你必须使用 self?
来访问 self 实例)
...
或[unowned self] (Response) -> Void in
如果您确定对象将在请求调用完成后出现。
您的 Alamofire 请求在后台运行。同时,您的 tableView 想要显示并调用 numberOfRowsInSection。这时候Alamofire还没有完成它的工作,所以adnames还没有设置。
设置 adNames 后,您需要使用 reloadData()
刷新 tableView。即
Alamofire.request(.GET, "http://codewithchris.com/code/afsample.json").responseJSON { (Response) -> Void in
if let value = Response.result.value{
let json = JSON(value)
self.adNames = json["secondkey"].arrayValue
self.tableView.reloadData()
}
}
然后tableView会刷新,重新调用numberOfRowsInSection,此时adNames不会为nil。
我正在练习,发现我的 class 属性(adNames) 无法分配。但是可以在外面赋值(我注释掉的地方)。这是我的代码:
import UIKit
import Alamofire
import SwiftyJSON
class AdTableViewController: UITableViewController {
var adNames: [JSON]?
override func viewDidLoad() {
super.viewDidLoad()
Alamofire.request(.GET, "http://codewithchris.com/code/afsample.json").responseJSON { (Response) -> Void in
if let value = Response.result.value{
let json = JSON(value)
print(json["secondkey"].arrayValue) //["item1","item2","item3"]
self.adNames = json["secondkey"].arrayValue
}
}
// self.adNames = ["item1", "item2", "item3"]
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let names = adNames {
return names.count
}
return 0
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
...
}
}
谁能告诉我原因吗?谢谢!
您正在传递给请求调用的闭包中访问 self。在闭包内使用捕获列表来保存对 self 对象的引用。
[weak self] (Response)
-> Void in(在这种情况下你必须使用 self?
来访问 self 实例)
...
或[unowned self] (Response) -> Void in
如果您确定对象将在请求调用完成后出现。
您的 Alamofire 请求在后台运行。同时,您的 tableView 想要显示并调用 numberOfRowsInSection。这时候Alamofire还没有完成它的工作,所以adnames还没有设置。
设置 adNames 后,您需要使用 reloadData()
刷新 tableView。即
Alamofire.request(.GET, "http://codewithchris.com/code/afsample.json").responseJSON { (Response) -> Void in
if let value = Response.result.value{
let json = JSON(value)
self.adNames = json["secondkey"].arrayValue
self.tableView.reloadData()
}
}
然后tableView会刷新,重新调用numberOfRowsInSection,此时adNames不会为nil。