【问题标题】:NSURLSession sometimes returns data but sometimes don't iOS 9 - Swift 2.0NSURLSession 有时返回数据但有时不返回 iOS 9 - Swift 2.0
【发布时间】:2016-01-06 16:31:40
【问题描述】:

我正在开发一个基于从指定 URL 请求的 JSON 对象的应用程序,但有时(不是每次)我没有得到任何结果
将显示一些代码 sn-ps 可以帮助确定这个简单的 (?) 问题
我的 class MyTestClass 中有一个名为“Data”(var Data:[String] = []) 的数组和以下函数:

func loadData(onComplete: ([String]) -> ()) {
        // Declaring a local array
        var Local:[String] = []

        // Preparing JSON request
        let address = "<URL goes here>"
        let url = NSURL(string: address)
        let request = NSURLRequest(URL: url!)

        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithRequest(request) { (data, response, error) in
            if (data?.length > 0 && error == nil) {
                let responseData = data as NSData!

                if responseData == nil {
                    // Presenting some alert
                } else {
                    let jsonObject: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(responseData!, options: NSJSONReadingOptions.MutableContainers)

                    if jsonObject == nil {
                        // Presenting some alert
                    } else {
                        let json: NSArray = jsonObject as! NSArray

                        for (var i = 0; i < json.count; i++) {
                            if let obj = json[i] as? NSDictionary {
                                if let m = obj["m"] as? String {
                                    if m != "Unknown" {
                                        Local.append(m)
                                    }
                                }
                            }
                        }

                        onComplete(Local)
                    }

                }
            } else if error != nil {
                NSLog("Error: %@", error!)
            }
        }

        // Starting task
        task.resume()
    }

在 viewDidLoad() 中我正在执行以下操作:

// Loading data
loadData { (d) in
    for dat in d {
        self.Data.append(dat)
    }
}

我在每个 ViewController 中都使用这个解决方案(功能 100% 相同 [CTRL+C / CTRL+V]),我的层次结构如下: 表1->表2->表3

Table1 可以正常工作,没有问题,每次都可以正常显示结果,Table2 大部分时间都可以正常工作(有时很少不显示结果),但 Table3 大约 80% 的时间会发疯。

因为这件事发生在我身上,我很生气,在 iOS 9 之前,我使用同步调用并且没有任何问题,因为它是一个小应用程序,但现在我什至不知道如何使它与这个 @987654325 一起工作@东西。

【问题讨论】:

  • 顺便说一句,我建议遵循 Cocoa 命名约定并以小写字母开头所有变量。 “数据”也具有误导性,因为按照惯例,这种名称往往与NSData 对象一起使用。我可能会建议strings(或者,更好的是,建议这些字符串是什么类型的字符串)而不是Data
  • 我只是用这个名字作为我的问题的一个例子,在我的实际应用中它是不同的,但感谢你的建议。

标签: ios swift ios9 nsurlsession


【解决方案1】:

您需要使用 dispatch async 并在 loadData 块完成后重新加载表视图的数据

use dispatch async with dataTaskWithRequest

【讨论】:

  • 谢谢,它现在可以工作了,但我还有一个类似的问题。如果我正在使用结构怎么办?如何正确加载它们? struct Information { var x = String() var y = String() var z = String() }我正在使用和上面一样的方法从网络获取数据并通过onComplete传递,但是数据似乎丢失了。
  • 过程大致相同。只要确保您致电reloadData(并在主队列中完成所有这些操作)就可以了。顺便说一句,我可能会建议使用struct Information { var x : String var y : String var z : String },然后使用Information(x: a, y: b, z: c)(其中abc 将是您的字符串)。如果这不起作用,请使用 example 创建新问题。
  • 您需要更改Local 变量的类型以返回您的结构
【解决方案2】:

您应该调用tableView.reloadData()(从主队列)请求完成,在您完成将所有这些字符串附加到您的数组之后。

loadData { (d) in
    dispatch_async(dispatch_get_main_queue()) {
        for dat in d {
            self.Data.append(dat)
        }
        self.tableView.reloadData()
    }
}

郑重声明,您已停用同步网络调用,这非常好。同步调用可能很容易,但它们可能会导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多