从服务器下载文件时应用程序冻结

时间:2016-08-02 12:52:52

标签: ios swift xcode string

我正在尝试从服务器下载一个txt文件但应用程序在我下载字符串时会冻结一点:

  override func viewDidAppear(animated: Bool) {



            let getPrice = try! String(contentsOfURL: NSURL(string: "http://site.cin/price.txt")!, encoding: NSUTF8StringEncoding)
            self.price.text = getPrice


    }

我不想使用AFNetwroking等......

3 个答案:

答案 0 :(得分:3)

您应用的所有用户界面都在主线程上运行。如果您尝试在主线程上执行任何与网络相关的任务(至少需要几秒钟),那么它将在该段时间内阻止主线程。因此,除了UI相关更改之外,您不应该在主线程上执行此类任务。因此,最好在网络调用上发出异步请求,并在完成时更新主线程上的UI

你应该做点什么,

  NSURLSession.sharedSession().dataTaskWithURL( NSURL(string: "http://site.cin/price.txt")!) { (data, response, error) in

        var getprice = NSString(data: data!, encoding: NSUTF8StringEncoding)

        dispatch_async(dispatch_get_main_queue(), { 

            self.price.text = getPrice
        })

    }

答案 1 :(得分:1)

您正在主线程上运行。试试这个:

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    let getPrice = try! String(contentsOfURL: NSURL(string: "http://site.cin/price.txt")!, encoding: NSUTF8StringEncoding)
    self.price.text = getPrice

    dispatch_async(dispatch_get_main_queue()) {
         // update some UI
    }
}

答案 2 :(得分:1)

试试这个:

let bgQueue = NSOperationQueue()

        bgQueue.addOperationWithBlock { 
            let getPrice = try! String(contentsOfURL: NSURL(string: "http://site.cin/price.txt")!, encoding: NSUTF8StringEncoding)
            self.price.text = getPrice
        }

此代码在后台运行,不会阻止您的主线程,因此应用程序不会冻结。