2015-06-04 2 views
1

Мое приложение отображает информацию, хранящуюся на нашем сервере, которая постоянно обновляется. Поэтому при просмотре данных загружает каждую страницу с данными, полученной с помощью следующего классаСлишком длинная загрузка данных при загрузке UITableView из NSURLConnection

public class GetRemoteData { 

    class func getDataFromServer(success: ((svrData: NSData!) -> Void)) { 
    //Set http connection settings 
    let httpMethod = "GET" 
    let timeout = 10 
    let url = NSURL(string: ViewController.gVariables.gUrl) 
    let urlRequest = NSMutableURLRequest(URL: url!, 
     cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, 
     timeoutInterval: 10.0) 
    let queue = NSOperationQueue() 
    //Initiate connection to server 
    NSURLConnection.sendAsynchronousRequest(
     urlRequest, 
     queue: queue, 
     completionHandler: {(response: NSURLResponse!, 
      data: NSData!, 
      error: NSError!) in 
      //If data recieved load into svrData 
      if data.length > 0 && error == nil{ 
       let json = NSString(data: data, encoding: NSASCIIStringEncoding) 
       if let urlData = json { 
        let data = json!.dataUsingEncoding(NSUTF8StringEncoding) 
        success(svrData: data) 
      } 
      }else if data.length == 0 && error == nil{ 
       ViewController.gVariables.gError = "No data was recieved, please check your connection" 
      } else if error != nil{ 
       ViewController.gVariables.gError = "Error occurred - \(error), please check your connection" 
      } 
     } 
    ) 
    } 
} 

Нагрузки данных быстро много времени, двигающегося между ViewControllers, которые все используют этот класс, но особенно, когда двигаются в обратном направлении первого прохода через каплю через sendAsynchronousRequest без успеха. ViewController продолжает и отображает пустую таблицу. Затем приведенный выше код работает в потоке снова успешно на этот раз, и данные появляются, но это может занять до 30 секунд! Приведенный ниже код используется ViewController в ViewDidLoad

GetRemoteData.getDataFromServer { (svrData) -> Void in 
    let jsonDict = NSJSONSerialization.JSONObjectWithData(svrData, options: nil, error: nil) as! NSDictionary 
    if (ViewController.gVariables.gError != "") { 
     let alertController = UIAlertController(title: "Warning", message: 
     ViewController.gVariables.gError, preferredStyle: UIAlertControllerStyle.Alert) 
     alertController.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default,handler: nil)) 
     alertController.presentViewController(alertController, animated: true, completion: nil) 
    } 
    if let items = jsonDict["products"] as? NSArray { 
     for jsonItem in items { 
      if let name = jsonItem.valueForKey("name") as? String 
      { 
       self.brandNames.addObject(name) 
      } 
      if let code = jsonItem.valueForKey("code") as? String 
      { 
       self.brandCodes.addObject(code) 
      }       
     } 
    } 
    self.tableView.reloadData() 
} 

Может кто-то пожалуйста, скажите мне, как я могу преодолеть этот раз вопрос задержки

+1

Я объяснил это [здесь] (http://stackoverflow.com/questions/30625275/swift-tableview-displays-json-data-very-slow/30625717#30625717), вы должны поместить свой json-запрос в 'dispatch_async (dispatch_get_main_queue())' –

+0

reload tableview следующим образом: 'dispatch_async (dispatch_get_main_queue()) { self.tableView.reloadData() } ' –

+0

Это сработало для меня, спасибо – user616076

ответ

0

Оба вышеуказанных ответов решить мою проблему, позволяя мой код JSon работать на основная нить

Смежные вопросы