2016-06-20 3 views
1

私は2つのリクエストを持っています。それぞれが異なるデータを取得しています。 2つのリクエストのすべてがリクエストしているときに指標を表示する必要があります。どのように私はこれを行うことができますか? は、これが私の最初の要求である:2つのリクエストのインジケータを表示

func productList(tableView:UITableView,spinner:UIActivityIndicatorView,index1:Int,index2:Int,index3:Int){ 

    if product.count<=0{ 

     alamoFireManager?.request(.GET, "http://mobile.unimax.kz/api/Default1",parameters: ["type1id":index1,"type2id":index2,"type3id":index3,"name":"","userid":1089]) 
      .responseJSON { response in 
       guard response.result.error == nil else { 
        if let httpError = response.result.error { 
         switch(httpError.code){ 
         case -1009: 
          let alert = UIAlertView(title: "Ошибка",message: "Нету интернета!!",delegate: nil,cancelButtonTitle: "OK") 
          alert.show() 
          break 
         default: 
          let alert = UIAlertView(title: "Ошибка",message: "Повторите попытку!!",delegate: nil,cancelButtonTitle: "OK") 
          alert.show() 
          break 
         } 
        } else { //no errors 
         let statusCode = (response.response?.statusCode)! 
         print(statusCode) 
        } 
        spinner.stopAnimating() 
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
        return 

       } 

       if let value = response.result.value { 
        // handle the results as JSON, without a bunch of nested if loops 
        let product = JSON(value) 
        for (_,subJson):(String, JSON) in product { 

         let img:NSData 
         if let src=subJson["sphoto"].string{ 

          if src.containsString("jpg"){ 
           let range = src.startIndex.advancedBy(2)..<src.endIndex 
           let substring = src[range] 
           var urlString = "http://admin.unimax.kz/\(substring)" 
           urlString = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! 
           if let dataFromURL=NSData(contentsOfURL: NSURL(string: urlString)!){ 
            img=dataFromURL 
           } 
           else{ 
            img=NSData(contentsOfURL: NSURL(string: "http://zhaksy-adam.kz/Images/domalak.png")!)! 
           } 
          } 
          else{ 
           img=NSData(contentsOfURL: NSURL(string: "http://zhaksy-adam.kz/Images/domalak.png")!)! 
          } 
         } 
         else{ 
          img=NSData(contentsOfURL: NSURL(string: "http://zhaksy-adam.kz/Images/domalak.png")!)! 
         } 

         //Do something you want 
         let id=subJson["id"].int! 
         let name=subJson["name"].string! 
         let price=subJson["price"].int! 
         let description=subJson["description"].rawString() 
         self.product.append(Product(id:id,title: name, img: UIImage(data: img), price: price,desc:description!)) 
        } 
        spinner.stopAnimating() 
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
        tableView.reloadData() 
       } 
     } 
    } 
    else{ 
     spinner.stopAnimating() 
     UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
     tableView.reloadData() 
    } 
} 

、これは私の2番目のリクエストです:

UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
    indicator.startAnimating() 

    localDB.getUserInfo() 
    getRequests.productList(tableView, spinner: indicator, index1: catalog1Index, index2: catalog2Index, index3: catalog3Index) 
    if localDB.user.count>0{ 
     getRequests.getFavs(localDB.user[0].id, tableView: tableView, spinner: indicator) 
    } 
    localDB.checkCart(tableView, tabCtrl: tabBarController!) 

答えて

0

それを行うには非常に高速な方法:

func makeGetFav(userID:Int,completionHandler: (responseObject:JSON) ->()) { 
    alamoFireManager?.request(.GET, "http://mobile.unimax.kz/api/Klientapi/?authid=\(userID)") 
     .responseJSON {response in 
      guard response.result.error == nil else { 
       if let httpError = response.result.error { 
        switch(httpError.code){ 
        case -1009: 
         let alert = UIAlertView(title: "Ошибка",message: "Нету интернета!!",delegate: nil,cancelButtonTitle: "OK") 
         alert.show() 
         break 
        default: 
         let alert = UIAlertView(title: "Ошибка",message: "Повторите попытку!!",delegate: nil,cancelButtonTitle: "OK") 
         alert.show() 
         break 
        } 
       } else { //no errors 
        let statusCode = (response.response?.statusCode)! 
        print(statusCode) 
       } 
       return 
      } 
      completionHandler(responseObject: JSON(response.result.value!)) 
    } 
} 

func getFavs(userID:Int,tableView:UITableView,spinner:UIActivityIndicatorView){ 
    getFavRequets(userID){(responseObject) in 
     if responseObject != nil{ 
      self.favs.removeAll() 
      self.localDB.clearFav() 
      for (_,subJson):(String, JSON) in responseObject { 
       self.favs.append(FavModel(id: subJson["id"].int!, title: subJson["name"].string!, price: subJson["price"].int!)) 
      } 
      spinner.stopAnimating() 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
      tableView.reloadData() 

     } 
    } 
} 

私はそれをすべてを呼び出すがあります。

// global var 

var isIndicatorActive : Bool = false 


UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
    indicator.startAnimating() 
    self.isIndicatorActive = true 
if isIndicatorActive == false { 
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
     indicator.startAnimating() 
     self.isIndicatorActive = true 
} 

を、各行spinner.stopAnimating()追加した後:

self.isIndicatorActive = false 
0

私は、単一のネットワークアクティビティインジケータを使用して、あなたを提案し、ネットワーク活動を追跡するカウンタを維持し、あなたが呼び出す各alamoFireManager?.requestの前の行に10アプリケーション内で私は私の答えがテキストでもっと知っているが、あなたのコードを見れば、あなたは以下を実装できるようだ。

は、アクティビティインジケータがないことを示します。

新しいアクティビティが開始されるとすぐに、カウンターが0より大きい場合にカウンターを増分してからインディケーターを表示します。

アクティビティタスクが終了したらカウンタをデクリメントします。デクリメントする場合は、counterが0であるかどうかを確認し、インジケータの可視性をfalseに設定します。

PS:同期ブロックで増減することを忘れないでください。このためにobjc_sync_enter(..)とobjc_sync_exit(..)メソッドを使用することができます。

Thxを

0

あなたが実行している要求の数に応じて起動し、それを停止するシングルトンを使用して、それを制御することができます。

class NetworkActivityIndicator: NSObject { 

    static let sharedInstance = NetworkActivityIndicator() 

    private override init() { 
    } 

    var count = 0 { 
     didSet { 
      self.updateIndicator() 
     } 
    } 

    private func updateIndicator() { 
     if count > 0 { 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
     } else { 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
     } 
    } 
} 

ザ・あなたは単純に要求する前にNetworkActivityIndicator.sharedInstance.count += 1NetworkActivityIndicator.sharedInstance.count += 1あなたを呼び出します応答を取得する

0

最も簡単な方法は、関連付けられた要求が完了したかどうかを示す2つの変数をクラスに追加し、次にtを停止する関数を作成することです両方の変数が呼び出しが完了したことを示している場合に限り、スピナーを呼び出します。

クラスを複数のViewControllerに使用する場合は、構造化列挙型のコンボを追加して、どのリクエストが現在進行中であるかを示す変数を整理することをお勧めします。助けのための

例えば

class GetRequests { 

    var productsLoaded = false 
    var favoritesLoaded = false 

    func stopSpinnerIfNeeded(spinner: UIActivityIndicatorView) { 
     if productsLoaded && favoritesLoaded { 
      spinner.stopAnimating() 
      spinner.hidden = true 
     } 
    } 


    func productList(tableView:UITableView,spinner:UIActivityIndicatorView,index1:Int,index2:Int,index3:Int){ 

    defer { 
     productsLoaded = true 
     stopSpinnerIfNeeded(spinner) 
    } 

    if product.count<=0{ 

     alamoFireManager?.request(.GET, "http://mobile.unimax.kz/api/Default1",parameters: ["type1id":index1,"type2id":index2,"type3id":index3,"name":"","userid":1089]) 
     .responseJSON { response in 
      guard response.result.error == nil else { 
       if let httpError = response.result.error { 
        switch(httpError.code){ 
        case -1009: 
         let alert = UIAlertView(title: "Ошибка",message: "Нету интернета!!",delegate: nil,cancelButtonTitle: "OK") 
         alert.show() 
         break 
        default: 
         let alert = UIAlertView(title: "Ошибка",message: "Повторите попытку!!",delegate: nil,cancelButtonTitle: "OK") 
         alert.show() 
         break 
        } 
       } else { //no errors 
        let statusCode = (response.response?.statusCode)! 
        print(statusCode) 
       } 
       UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
       return 

      } 

      if let value = response.result.value { 
       // handle the results as JSON, without a bunch of nested if loops 
       let product = JSON(value) 
       for (_,subJson):(String, JSON) in product { 

        let img:NSData 
        if let src=subJson["sphoto"].string{ 

         if src.containsString("jpg"){ 
          let range = src.startIndex.advancedBy(2)..<src.endIndex 
          let substring = src[range] 
          var urlString = "http://admin.unimax.kz/\(substring)" 
          urlString = urlString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! 
          if let dataFromURL=NSData(contentsOfURL: NSURL(string: urlString)!){ 
           img=dataFromURL 
          } 
          else{ 
           img=NSData(contentsOfURL: NSURL(string: "http://zhaksy-adam.kz/Images/domalak.png")!)! 
          } 
         } 
         else{ 
          img=NSData(contentsOfURL: NSURL(string: "http://zhaksy-adam.kz/Images/domalak.png")!)! 
         } 
        } 
        else{ 
         img=NSData(contentsOfURL: NSURL(string: "http://zhaksy-adam.kz/Images/domalak.png")!)! 
        } 

        //Do something you want 
        let id=subJson["id"].int! 
        let name=subJson["name"].string! 
        let price=subJson["price"].int! 
        let description=subJson["description"].rawString() 
        self.product.append(Product(id:id,title: name, img: UIImage(data: img), price: price,desc:description!)) 
       } 
       UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
       tableView.reloadData() 
      } 
     } 
    } 
    else{ 

     UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
     tableView.reloadData() 
    } 
} 

    func getFavs(userID:Int,tableView:UITableView,spinner:UIActivityIndicatorView){ 
getFavRequets(userID){(responseObject) in 
     if responseObject != nil{ 
      self.favs.removeAll() 
      self.localDB.clearFav() 
      for (_,subJson):(String, JSON) in responseObject { 
       self.favs.append(FavModel(id: subJson["id"].int!, title: subJson["name"].string!, price: subJson["price"].int!)) 
      } 

      favoritesLoaded = true 
      stopSpinnerIfNeeded(spinner) 
      UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
      tableView.reloadData() 

     } 
    } 
} 
0

おかげでみんな。私はこのようにそれを解決する:

func makeReuest1(){ 
    if localDB.user.count>0{ 
     getRequests.getFavs(localDB.user[0].id) 
    } 
    makeRequest2() 
} 

func makeRequest2(){ 
    getRequests.productList(tableView, spinner: indicator, index1: catalog1Index, index2: catalog2Index, index3: catalog3Index) 
} 
関連する問題