2016-08-02 59 views
3

我试图从服务器上下载一个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和etc ...

+0

因为您正在主线程上运行下载,阻止UI –

+0

但是为什么您在主线程中显式执行下载?改用其他线程,仅返回主线程进行UI更新。 –

+0

我只是删除主线程 –

回答

1

试试这个:

let bgQueue = NSOperationQueue() 

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

这个代码在后台运行,不会阻止你的主线程,这样的应用程序不会冻结。

+0

最简单的解决方案! –

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 
    } 
} 
3

你的应用的所有UI都在主线程上运行。如果您尝试在主线程上执行任何与网络相关的任务(至少需要几秒钟),则会在该时间段内阻塞主线程。因此,除了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 
     }) 

    } 
+2

你应该解释他做错了什么,而不是只发布代码。 –

+1

@VladimirNul评论中有足够的解释 –

+0

@VladimirNul:在评论中已经给出了解释,然后我也根据你的建议更新了答案...... :) – Lion