2016-08-09 3 views
2

У меня есть приложение, которое загружает параметры UIPickerView из онлайн-файла JSON, в то время как оно может успешно это сделать, это очень медленно, и мне интересно, почему. Консоль печатает файл JSON за 2 секунды, но ему нравится еще 12 секунд, чтобы отобразить его в окне выбора, если я его не перетаскиваю вручную. Как я могу заставить PickerView быстрее загружать параметры без необходимости вручную перемещать их, чтобы показать параметры?UIPickerView медленно обновляется

Вот часть моего кода:

import UIKit 
class FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 
@IBOutlet weak var mypickerview: UIPickerView! 
var pickerData: [String] = [String]() 
override func viewDidLoad() { 
super.viewDidLoad() 

/*Begin Loading the list*/ 
let postEndpoint: String = "https://example.com/json.json" 
let session = NSURLSession.sharedSession() 
let url = NSURL(string: postEndpoint)! 
session.dataTaskWithURL(url, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 

guard let realResponse = response as? NSHTTPURLResponse where 
realResponse.statusCode == 200 else { 
print("Not a 200 response") 
return 
} 
do { 
if let ipString = NSString(data:data!, encoding: NSUTF8StringEncoding) { 
print(ipString) 
let jsonDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 

let One = jsonDictionary["One"] as! String 
let Two = jsonDictionary["Two"] as! String 
let Three = jsonDictionary["Three"] as! String 
let Four = jsonDictionary["Four"] as! String 

self.mypickerview.delegate = self 
self.mypickerview.dataSource = self 
self.pickerData = [One, Two, Three, Four] 
self.mypickerview.reloadAllComponents() 
self.mypickerview.delegate = self; 

} 
} catch { 
print("bad things happened") 
} 
}).resume() 
/*End Loading the list*/ 

ответ

2

вы должны вызвать ReloadAllcompenents() всегда на главной очереди потому что это обновит вид. dispatch_async должен решить проблему. надеюсь, что он поможет

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 

dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    dispatch_async(dispatch_get_main_queue()) { 
     self.mypickerview.reloadAllComponents() 
    } 
} 
+0

Спасибо! Это исправило это для меня! Обновит щедрость за 22 часа. – Matt

+0

Рад помочь :)) –

0

Вы перегрузочные сборщика на фоне очереди. Общими симптомами этого являются большие задержки с изменениями пользовательского интерфейса. Вам нужно отправить работу пользовательского интерфейса (все, что связано с сборщиком) в основную очередь.

Обработчики завершения сеансов сеанса URL вызываются в очередь делегатов для сеанса, который не является основной очередью.

0

Dispatch.main.async - Обновить pickerView на MAIN queue.

По моему опыту watchos, всякий раз, когда я обновлял UI в sessionDataTask completeBlock, он был SLOW, пока я не сделал это в главной очереди.

Другими словами, вы можете создать sessionDataTask в любом потоке или очереди, но в рамках завершенияBlock отправьте его в главной очереди/потоке. Вы всегда должны обновлять пользовательский интерфейс на mainQueue.

let session = URLSession.shared 
    let url = URL(string: "https://example.com")! 
    session.dataTask(with: url) { (data, response, error) in 

     if error != nil { 
      print(error!) 
      return 
     } 

     if let ipString = String(data: data!, encoding: String.Encoding.utf8) { 
      if let jsonDictionary = try? JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) { 

       DispatchQueue.main.async { //dispatch_async on MainQueue. 

        let One = jsonDictionary["One"] as! String 
        let Two = jsonDictionary["Two"] as! String 
        let Three = jsonDictionary["Three"] as! String 
        let Four = jsonDictionary["Four"] as! String 

        self.mypickerview.delegate = self 
        self.mypickerview.dataSource = self 
        self.pickerData = [One, Two, Three, Four] 
        self.mypickerview.reloadAllComponents() 

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