Arrays 在Swift中制作表格时,数组为空
因此,当我在get data函数中打印两个数组时,它具有我想要的值,但是,当我创建tableview时,计数为零,两个数组都为空。在过去的几个小时里,我一直在试图解决这个问题,也尝试过NSArraysArrays 在Swift中制作表格时,数组为空,arrays,swift,Arrays,Swift,因此,当我在get data函数中打印两个数组时,它具有我想要的值,但是,当我创建tableview时,计数为零,两个数组都为空。在过去的几个小时里,我一直在试图解决这个问题,也尝试过NSArrays var nameArray = [String]() var textArray = [String]() var urlStart = "https://api.deckbrew.com/mtg/cards?" @IBOutlet weak var cardTitle: UILabel!
var nameArray = [String]()
var textArray = [String]()
var urlStart = "https://api.deckbrew.com/mtg/cards?"
@IBOutlet weak var cardTitle: UILabel!
@IBOutlet weak var info: UITextView!
class Card: Mappable {
var name: String?
var store_url: String?
var text: String?
required init?(_ map: Map) {
}
func mapping(map: Map) {
name <- map["name"]
store_url <- map["store_url"]
text <- map["text"]
}
}
override func viewDidLoad() {
super.viewDidLoad()
func getData()
self.tableView.reloadData()
}
func getData() {
let myURLString = "https://api.deckbrew.com/mtg/cards/typeahead?q=sele"
let myURL = NSURL(string: myURLString)!
var myCardsArray = [Card]()
let mySession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let myDataTask = mySession.dataTaskWithURL(myURL) { (data, response, error) in
guard error == nil else {
print("There was error with the task")
return
}
do {
let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments)
for someCard in jsonData as! NSArray{
let card = Mapper<Card>().map(someCard)
myCardsArray.append(card!)
self.nameArray.append(card!.name!)
self.textArray.append(card!.text!)
}
} catch {
print("There was an error")
}
}
myDataTask.resume()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return nameArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell : TableViewCell! = tableView.dequeueReusableCellWithIdentifier("Card") as! TableViewCell
cell.cardTitle.text = nameArray[indexPath.row] as! String
cell.cardInfo.text = textArray[indexPath.row] as! String
return cell as TableViewCell
}
override func didReceiveMemoryWarning() {
var nameArray=[String]()
var textArray=[String]()
var urlStart=”https://api.deckbrew.com/mtg/cards?"
@IBVAR卡片标题:UILabel!
@IBV弱var信息:UITextView!
类别卡:可映射{
变量名称:字符串?
var-store\u url:String?
变量文本:字符串?
必需的初始化(umap:map){
}
func映射(映射:映射){
名称UITableViewCell
{
让单元格:TableViewCell!=tableView.dequeueReusableCellWithIdentifier(“卡”)作为!TableViewCell
cell.cardTitle.text=nameArray[indexPath.row]作为!字符串
cell.cardInfo.text=textArray[indexPath.row]as!String
返回单元格作为TableViewCell
}
重写函数didReceiveMemoryWarning(){
}
}使用异步方法获取数据后,应在此处重新加载表视图:
do {
let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments)
for someCard in jsonData as! NSArray{
let card = Mapper<Card>().map(someCard)
myCardsArray.append(card!)
self.nameArray.append(card!.name!)
self.textArray.append(card!.text!)
//////// here
dispatch_async(dispatch_get_main_queue()...) {
self.tableView.reloadData()
}
}
do{
让jsonData=try NSJSONSerialization.JSONObjectWithData(data!,选项:NSJSONReadingOptions.AllowFragments)
对于jsonData as!NSArray中的某张卡{
让card=Mapper().map(someCard)
myCardsArray.append(卡片!)
self.nameArray.append(card!.name!)
self.textary.append(card!.text!)
////////这里
dispatch\u async(dispatch\u get\u main\u queue()…){
self.tableView.reloadData()
}
}
getData的键元素运行在不同的线程中(通过NSURLSession
)
这样,当表中的<代码> ReLoad DATABOS/COD>填充在<代码> VIEWDATABORE 中时,数组可能仍然是空的。您可能需要考虑在<代码> NSLLISTUCT/<代码>的闭包(这可能看起来很慢)的结尾刷新表。或者使用另一种方法确保在
重新加载数据之前填充数组
对不起,我必须进行否决表决,因为您建议的解决方案存在严重问题:在完成处理程序中(它在私有调度队列上执行),您正在访问和修改self.nameArray
和self.textArray
。这些也在主线程中同时访问,这会导致数据竞争。当应用程序更新数组时,以及当UIKit同时访问同一数组时,例如在滚动时,应用程序可能会崩溃。@SagarGovani@CouchDeveloper在他的情况下不是,这是在主线程中重新加载接口的正确方法。显示正确的方式,而不是仅仅投反对票