2016-01-05 3 views
0

Я пытался понять это сейчас. Я думаю, что я довольно сильно исчерпал все варианты исследований, поэтому я даю это вам, ТАК заглядывает.Индикатор активности отображения в TableView с асинхронным программированием - Swift

У меня есть вид на стол, который выходит на веб-представление. Веб-представление рисует карту, иногда с тысячами координат, поэтому время загрузки иногда может быть несколько длинным, очевидно, в зависимости от устройства пользователя. Поэтому я хочу подключить индикатор активности, чтобы пользователь знал, что приложение не разбилось.

Так что я создал индикатор активности программно и установил его для активации на didSelectRowAtIndexPath. Проблема здесь в том, что индикатор не начинает показываться, пока задача не будет завершена - и какова точка индикатора. Поэтому я понимаю, что решение здесь - сделать это асинхронно, но решение, которое я пробовал, не имеет никакого эффекта. Я также попытался подключить код в функции prepareForSegue, но это еще хуже - он переходит к представлению карты перед загрузкой данных, таким образом отображая пустую карту.

Любая помощь здесь? Ниже мой код. Благодаря!

class MapSelect: UITableViewController { 

    let subdivisionArray = [There's an array here] 

    let selectionArray = [There's an array here] 

    let model = Model() 
    var myView = UIView() 
    var activityIndicator = UIActivityIndicatorView() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.navigationController?.navigationBarHidden = false 

     myView = UIView(frame: CGRectMake(0, 0, self.tableView.frame.size.width, self.tableView.frame.size.height)) 
     myView.backgroundColor=UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0) 
     myView.alpha = 0.0 
     UIView.animateWithDuration(1.0, animations: {() -> Void in 
      self.myView.alpha = 0.5 
     }) 
     self.view.addSubview(myView) 
     activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge) 
     activityIndicator.startAnimating() 
     activityIndicator.center = CGPointMake(self.tableView.frame.size.width/2, self.tableView.frame.size.height/2) 
     self.tableView.addSubview(activityIndicator) 
     self.stopSpinner() 


    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return subdivisionArray.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell! 

     cell.textLabel?.font = UIFont.boldSystemFontOfSize(18) 
     cell.textLabel?.text = subdivisionArray[indexPath.row] 

     return cell 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     if subdivisionArray[indexPath.row] != "County" { 
      performSegueWithIdentifier("toMapSelect2", sender: self) 
     } else { 

      self.spinner() 

      let seconds = 0.1 
      let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds 
      let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
      dispatch_after(dispatchTime, dispatch_get_main_queue(), { 

        self.performSegueWithIdentifier("toMapView", sender: self) 

      }) 
      self.stopSpinner() 

     } 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { ... } 

    func spinner() { 
     myView.hidden = false 
     myView.alpha = 0.0 
     UIView.animateWithDuration(1.0, animations: {() -> Void in 
      self.myView.alpha = 0.5 
     }) 
     activityIndicator.startAnimating() 
     activityIndicator.hidden = false 
    } 

    func stopSpinner() { 
     myView.hidden = true 
     activityIndicator.stopAnimating() 
     activityIndicator.hidden = true 
    } 

} 

Здесь также есть код, который загружает карту на вебе-просмотр в отдельном «классе MapView»:

override func viewDidLoad() { 
     super.viewDidLoad() 


     do { 
      if prevSelectionType == "ed" { 
       prevSelectionLabel = prevSelection 
       prevSelection = model.decodeElectionDistrict(prevSelection) 
      } else { 
       prevSelectionLabel = prevSelection 
      } 

     } 

     var regionEds : Array<String> = Array<String>() 

     do { 
      var pred : NSPredicate 
      pred = NSPredicate(format: "region = %@", "") 
      if prevSelectionType != "county" { 
       if prevSelectionType != "ed" { 
        pred = NSPredicate(format: "region = %@" , prevSelection) 
       } else { 
        pred = NSPredicate(format: "ed = %@" , prevSelection) 
       } 
       requestPick3.predicate = pred 
      } 
      requestPick3.resultType = NSFetchRequestResultType.DictionaryResultType 
      requestPick3.propertiesToFetch = ["ed"] 
      requestPick3.returnsDistinctResults = true 
      let resultsPre = try context.executeFetchRequest(requestPick3) 
      for result in resultsPre { 
       let resultEd : String = result["ed"] as! String 
       regionEds.append(resultEd) 
      } 
     } catch { 
      print("Error") 
     } 

     self.mapView.delegate = self 

     var dCoords : Array<Double> = Array<Double>() 
     var twdString : String = String() 
     var query : PFQuery = PFQuery() 
     do { 
      if prevSelectionType != "county" { 
       let predicate = NSPredicate(format:"twd IN %@", regionEds) 
       query = PFQuery(className: "Coords2016", predicate: predicate) 
      } else { 
       query = PFQuery(className: "Coords2016") 
      } 
      query.limit = 1000 
      let userArray = try query.findObjects() 
      //   print(userArray) 
      for item in userArray { 
       dCoords = item["coords"] as! Array<Double> 
       twdString = item["twd"] as! String 
       twdString = model.twdToEdAbbrev(twdString) 
       addBoundry(dCoords, twd: twdString) 
      } 

     } catch { 
      print("Error") 
     } 

     // DEFINE CENTER LOCATION 
     let initialLocation = CLLocation(latitude: centerLat, longitude: centerLong) 

     // DEFINE ZOOM SIZE 
     centerMapOnLocation(initialLocation) 

     toggleSwitch.setOn(false, animated: true) 

    } 
+0

Почему бы не поставить индикатор на ваш MapView? И в своем MapViewController сначала скройте веб-просмотр, покажите индикатор, а после загрузки веб-представления покажите его и скройте индикатор. – Surely

+0

Я бы определенно пошел на это решение, если мог (и, может быть, могу, если смогу это выяснить). Проблема в том, что экран останавливается на столе, пока хрустят данные координат - и я не совсем уверен, почему это так, так как вся эта работа выполняется в MapViewController. –

+0

Вы также можете опубликовать свой код веб-просмотра, просто часть загрузки URL-адреса. Я думаю, вы можете попытаться поместить часть url загрузки в viewDidAppear вашего контроллера MapView. – Surely

ответ

0

проблема с вашим кодом, что вы начинаете вертушку, а затем остановить он снова почти сразу, и, конечно же, прежде чем какой-либо работы завершила

вам нужно поместить всю работу в фоновом режиме очереди, но все, что обновляет интерфейс должно быть сделано в основной очереди

dispatch_async(dispatch_get_main_queue(), { 
    self.spinner() 
}) 

а затем

dispatch_async(dispatch_get_main_queue(), { 
    self.updateMapInSomeWay() 
}) 

Если вы делаете это так, что вам не нужно возиться с 0.1с задержки перед началом

Вот хороший учебник, чтобы вы начали на фоновая обработка http://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial