首页 > 解决方案 > 外部访问该类时,Collection 为空

问题描述

我创建了一个类 (Cards),它包含一个名为 tWelcomeItem 的类的集合。SendRequest 函数将 JSON 解码为 tWelcomeItem(来自 Trello API 请求的卡片)。

当 Cards 类中的 SendRequest 函数运行时,它会打印集合中项目的最后一个索引(16 个项目)。这是意料之中的。

但是,当我从 Storyboard 的视图控制器访问该集合时,它会打印 0 个项目。

为什么当从 View Controller 访问它的实例时集合是空的?

视图控制器- 打印集合中的零个项目。

private var dm:Cards = Cards(id:"trelloCardID")

override func viewDidLoad() {
    
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    
    print("* viewDidLoad() *")
    
    print("Total Collection Items: " + String(dm.CardCollection.endIndex))
    
    DataView.dataSource = self
    
    DataView.delegate = self
    
    print("* // viewDidLoad() *")
    
}

Cards Class - 打印行返回 16 个项目。

public class Cards {

var CardCollection = [tWelcomeElement]()
var BoardID:String = ""
var uri:String = ""

let Manager:TrelloHelper = TrelloHelper()

init(id:String) {
    SendRequest(BoardID: id)
    
}

public func SendRequest  (BoardID:String) {
    // SET CLASS PROPERTIES
    self.BoardID = BoardID
    self.uri = "/1/boards/\(self.BoardID)/cards"
    
    // BUILD HTTP REQUEST
    let request:URLRequest = Manager.BuildURL(uri: self.uri, params: "")
    
    // PERFORM HTTP REQUEST
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            
            // CHECK FOR ERRORS
            if let error = error {
                print("Error took place \(error)")
                return
            }
     
            // Convert HTTP Response Data to a String
            if let data = data, let _ = String(data: data, encoding: .utf8) {
                
                do {
                        
                    self.CardCollection = try JSONDecoder().decode([tWelcomeElement].self, from: data )
                        
                    print("Total Collection Items:" + String(self.CardCollection.endIndex))
                        
                    } catch {
                    print("Error during JSON serialization: \(error.localizedDescription)")
                    }
                    
            } // END-IF
        
    } // END-LET
    
    task.resume()
    
} // END-FUNCTION

}

标签: jsonswift

解决方案


URLSession对象异步发出请求。当您初始化对象并viewDidLoad打印其 collectionView 的最后一个索引时,您的网络调用应该已经开始,但它不太可能已经完成,因此您看到endIndex0 的原因。


推荐阅读