除非在@IBAction中,否则Swift无法从其他Swift文件中提取信息

时间:2016-03-10 01:21:34

标签: json swift ibaction

我目前正在使用最新版本的Swift。简而言之,我从网页中提取信息并将所述信息存储到数组中。我是这样做的(原谅缩进......):

class TransactionData {

var transactions: [Transaction] = []

init() {
    getTransactionData()
}

func getTransactionData() {
    let jsonUrl = "php file with json"

    let session = NSURLSession.sharedSession()
    let shotsUrl = NSURL(string: jsonUrl)

    let task = session.dataTaskWithURL(shotsUrl!) {
        (data, response, error) -> Void in

        do {

            let jsonData: NSArray = (try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as? NSArray)!

            for var index = 0; index < jsonData.count; ++index {

                let orderID: String = jsonData[index]["orderID"] as! String
                let orderDate: String = jsonData[index]["orderDate"] as! String
                let orderType: String = jsonData[index]["orderType"] as! String
                let paymentType: String = jsonData[index]["paymentType"] as! String
                let itemName: String = jsonData[index]["itemName"] as! String
                let itemPrice: String = jsonData[index]["itemPrice"] as! String
                let itemTaxes: String = jsonData[index]["itemTaxes"] as! String
                let orderModifications: String = jsonData[index]["orderModifications"] as! String
                let orderVariations: String = jsonData[index]["orderVariations"] as! String

                let transaction = Transaction(orderID: orderID, orderDate: orderDate, orderType: orderType, paymentType: paymentType, itemName: itemName, itemPrice: itemPrice, itemTaxes: itemTaxes, orderModifications: orderModifications, orderVariations: orderVariations)

                self.transactions.append(transaction)
            }
        } catch _ {
            // Error
        }
    }
    task.resume()
}

当我想调用这些信息时,我使用了这个:

let transactionData = TransactionData()
for transaction in transactionData.transactions {
     print("\(transaction)")
}

当我使用IBAction时,信息被传递到ViewController的唯一时间。如果我在其他地方尝试,它不会通过读取信息。例如,我正在尝试从在线网站提取信息以传递到TableViewController。它只是不会提取信息。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要在ViewController之间建立连接,以便他们可以在它们之间传递数据。一种常见的方法是通过在屏幕之间的segue期间设置的delegate协议。这是tutorial就可以了。

为了稍微扩展一下,听起来你有一个类Transactions,你的ViewController会调用它来加载数据。如果您然后尝试在TableViewController中访问该实例,那么您将无法拥有数据,因为正在创建新实例。有两种方法可以避免这个问题:

  1. 从VC传递数据(或对Transactions的引用) - &gt; TVC通过delegate
  2. 为您的数据模型使用singleton模式,以便所有人都可以访问它。
  3. 为了避免并发问题,我建议做前者。