Ich brauche den Aktivitätsindikator, um zu starten, wenn eine Webanforderung erstellt wird, und zu stoppen, sobald sie beendet ist. Im Moment wird die Anzeige angezeigt, aber die .stopAnimation
wird gerade ausgeführt und wartet nicht auf die Beendigung der Web-Anfrage.kann Aktivitätsanzeige nicht nach asynchroner Webanforderung stoppen
import UIKit
class ViewController:
UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {
@IBOutlet weak var locationPickerOutlet: UIPickerView!
@IBOutlet weak var theProgressOutlet: UIActivityIndicatorView!
var locationspickerData: [String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
populateLocations()
}
func populateLocations() {
self.locationspickerData = ["All Locations"]
let url:URL = URL(string: "http://<web address>")!
let session = URLSession.shared
let request = NSMutableURLRequest(url: url)
request.httpMethod = "GET"
//request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let task = session.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
guard let _:Data = data, let _:URLResponse = response , error == nil else {
return
}
let json: Any?
do
{
json = try JSONSerialization.jsonObject(with: data!, options: [])
}
catch
{
return
}
guard let data_list = json as? NSArray else
{
return
}
if let locations_list = json as? NSArray
{
for i in 0 ..< data_list.count
{
if let locations_obj = locations_list[i] as? NSDictionary
{
if let location_name = locations_obj["name"] as? String
{
self.locationspickerData.append(location_name)
}
}
}
self.locationPickerOutlet.delegate = self
self.locationPickerOutlet.dataSource = self
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
self.theProgressOutlet.stopAnimating()
}
}
})
task.resume()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return locationspickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return locationspickerData[row]
}
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
let titleData = locationspickerData[row]
let myTitle = NSAttributedString(string: titleData, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 15.0)!,NSForegroundColorAttributeName:UIColor.blue])
return myTitle
}
Vielleicht ist Ihre Web-Anfrage so schnell ;-). Btw: Beachten Sie, dass der Indikator im Falle eines Fehlers nicht stoppt. Das wäre ein gutes Beispiel für die "Defer" -Anweisung. – vadian
PS: ... und der übliche Hinweis: Verwenden Sie kein 'NSMutable ...', wenn es in Swift entweder ein natives Swift-Pendant gibt und nicht 'NSArray',' NSDictionary'. – vadian
Welche Alternative gibt es für NSDictionary? – t2nator