数据从全局数组中消失

Posted

技术标签:

【中文标题】数据从全局数组中消失【英文标题】:Data disappearing from global array 【发布时间】:2017-05-26 11:09:43 【问题描述】:

我在我的父类中定义了一个全局数组,我试图让数组填充从REST 服务GET 调用从JSON 文件填充的对象。这个想法是我定义了全局数组,填充了从 JSON 文件填充的对象,然后数据将在我的 tableviewcell 内部类中使用。但是我注意到数据被填充了,它正确地获得了json,数据被输入到数组中,但是所有的东西都在方法之外被删除了。在内部类中,数据不存在,甚至在网络请求括号之外。我无法想象问题是什么。

这是我将数组初始化为全局数组:

class ContentDeliveryViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate

public var ListOfFiles: [Asset_Content] = []
public var ListOfTags: [String] = []

这是获取 json 并填充数组的方法,其中包含括号外的打印语句,表明数组为空。

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    print("short CALLED")
    let cell = self.tableView.dequeueReusableCell(withIdentifier: "ContentDeliveryCell", for: indexPath as IndexPath) as! ContentDeliveryCell

    var content: AWSContent
    //fix this
    if(tableView == self.searchDisplayController?.searchResultsTableView)
        print("search part called!!")
        content = filteredList[indexPath.row]
    else
        content = contents![indexPath.row]
    

    if(content.key.contains(IDENTIFIER))
        //
        let url = URL(string: URL)
        let task = URLSession.shared.dataTask(with: url!)
            data, response, error in guard error == nil else
                print(error!)
                return
            
            guard let data = data else
                print("Data is empty")
                return
            
            let json = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [[String: AnyObject]]
            var asset: Asset_Content
            for jay in json! 
                let category = jay["BIGCATEGORY"] as? String
                let diagnosis = jay["DIAGNOSIS"] as? String
                let perspective = jay["PERSPECTIVE"] as? String
                let name = jay["NAME"] as? String
                let title = jay["Title"] as? String
                let UnparsedTags = jay["TAGS"] as? String
                let filename = jay["FILENAME"] as? String

                let tagArray = UnparsedTags?.characters.split(separator: ",")
                for tag in tagArray!
                    if(self.ListOfTags.contains(String(tag)))

                    else
                        self.ListOfTags.append(String(tag))
                        print("TAGCOUNT == ", self.ListOfTags.count)
                    
                

                asset = Asset_Content(category!, diagnosis!, perspective!, name!, title!, filename!)
                self.loadJson(forFile: asset)
                print("RightCount === ", self.ListOfFiles.count)// FILLED ARRAY
            
            print("FirstCount === ", self.ListOfFiles.count)//FILLED ARRAY
        

        task.resume()
        cell.isHidden = true
        print("FirstCount === ", self.ListOfFiles.count)// EMPTY ARRAY
        print("TAGCOUNT == ", self.ListOfTags.count) // EMPTY ARRAY
        return cell
    else
        cell.prefix = prefix
        cell.content = content
        print("KEY" ,content.key)
        cell.isHidden = false
        return cell
    

【问题讨论】:

cellForRowAt 是下载和解析 JSON 的错误位置。您的数组是空的,因为 dataTask 异步工作。 完成后如何让它加载数据? 【参考方案1】:

正确的方法:

    加载数据 将 Json 解析为对象 将对象提交到单元格(例如:cell.object = ...)并让单元格自行配置 重新加载表格视图

【讨论】:

以上是关于数据从全局数组中消失的主要内容,如果未能解决你的问题,请参考以下文章

添加/删除 UITableView 选择到数组,复选标记在滚动时消失 - Swift

解 消失的数字

如何阻止 UITableView 单元格在视图更改时消失

管道从 Azure 数据工厂消失了?

为啥添加导航控制器会使我的数组消失?

LeetCode 448.找到所有数组中消失的数字 - JavaScript