2017-03-08 15 views
-4

私はcoredataテーブルを持っており、ユーザーのログイン時に大きなデータを挿入したい場合があります。私はコアデータを持っている機能を持っていると私はPKHUDを持っている私はそれらを使用しようとしているが、は、viewcontrollerすべてのデータの挿入を完了するためにを待っていない私はコアデータがPKHUD私はそれを解決することはできますか? 私のコードは以下の通りです。 コアデータを追加する方法をすばやく段階的に追加する3

以下
func coreDataAdd(where : String) { 


     let headers: HTTPHeaders = [ 
      "Accept": "text/html", 
      "Content-Type" : "application/x-www-form-urlencoded" 
     ] 

     let parameters = [ 
      "user": "\(prefs.string(forKey: "user")!)" 
      ] as [String : String] 
     Alamofire.request(geturl, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers) 
      .responseData{ response in 
       let json = JSON(data:response.result.value!) 
       let success = json["Success"]["status"].boolValue 
       let addJson = json["\(where)_list"].array 

       if success == true { 

        if where == "User" { 
        for users in addJson! { 
          let addUser = NSEntityDescription.insertNewObject(forEntityName: "\(where)", into:context) as! User 
          addUser.id = users["id"].int32Value 
          addUser.name = users["name"].stringValue 
          (UIApplication.shared.delegate as! AppDelegate).saveContext() 
        } 

        } 



       }else{ 


       } 
        } 

    } 

答えて

1

は、あなたが私のコードで私の例を表示することができ、あなたの機能のために完了ハンドラを使用してみたり

coreDataAdd (where : "User", onCompletion: { (isFinished) in 
     if isFinished { 
      coreDataAdd (where : "Profile", onCompletion: { (isFinished) in 
      if isFinished { 
      coreDataAdd (where : "Profile", onCompletion: { (isFinished) in 
      if isFinished 
      //Here segue to the next view 
      let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
            let nextViewController = storyBoard.instantiateViewController(withIdentifier: "Profile") as! profileViewController 
            self.present(nextViewController, animated:true, completion:nil) 

     }) 
     } 
     } 

     }) 
    }) 



    func coreDataAdd(where : String, onCompletion: @escaping (Bool) -> Void) { 


    let headers: HTTPHeaders = [ 
     "Accept": "text/html", 
     "Content-Type" : "application/x-www-form-urlencoded" 
    ] 

    let parameters = [ 
     "user": "\(prefs.string(forKey: "user")!)" 
     ] as [String : String] 
    Alamofire.request(geturl, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers) 
     .responseData{ response in 
      let json = JSON(data:response.result.value!) 
      let success = json["Success"]["status"].boolValue 
      let addJson = json["\(where)_list"].array 

      if success == true { 

       if where == "User" { 
       for users in addJson! { 
         let addUser = NSEntityDescription.insertNewObject(forEntityName: "\(where)", into:context) as! User 
         addUser.id = users["id"].int32Value 
         addUser.name = users["name"].stringValue 
         (UIApplication.shared.delegate as! AppDelegate).saveContext() 

       } 
       onCompletion(true) 
       } 



      }else{ 


      } 
       } 

} 
+0

あなたは私のコードで私に答えを与えることができます私はあなたの答えを承認した後、私はあなたが – SwiftDeveloper

+0

うまく働いた場合に承認されます。 – SwiftDeveloper

-1

 @IBAction func login (sender: UIButton){ 

     if prefs.string(forKey: "name") == "John"{ 
    }else{ 
    if prefs.string(forKey: "adddata") == "yes"{ 

     // LOADING BAR STARDED 
     PKHUD.sharedHUD.contentView = PKHUDProgressView() 
     PKHUD.sharedHUD.show() 

     // HERE MY ADD CORE DATA FUNCTIONS 
     coreDataAdd(where : "User") 
     coreDataAdd(where : "Profile") 
     coreDataAdd(where : "Games") 


if prefs.string(forKey: "go") == "yes"{ 

     let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
             let nextViewController = storyBoard.instantiateViewController(withIdentifier: "Profile") as! profileViewController 
             self.present(nextViewController, animated:true, completion:nil) 

} 

     // LOADING BAR END 
     DispatchQueue.main.async { 
     PKHUD.sharedHUD.hide(animated:false); 
      } 
} 

} 
} 

My機能、それはコアデータの変更を追跡すると、あなたのテーブルビューを変更する際にあなたを伝えるためにコールバックを委任しているNSFetchedResultsControllerを使用してください。

+0

を待つために依存して操作キューを試してみて? ty – SwiftDeveloper

+0

保存コードは同じままですが、あなたが投稿しなかったあなたのテーブルビューコード(フェッチをしていると仮定したところ)が変わります。 'NSFetchedResultsController'を検索してドキュメントを読んでください。 –

-1

ここでの問題は、coreDataAddメソッドで非同期呼び出しを行うことです(ネットワークコールと同じように)。あなたが必要とするのは、すべてのネットワークコールの完了後にPKHUDローダを停止することです。

dispatch_groupを使用できます。 dispatch_group_notifyの中で、main queueにローダを非表示にしてください。

+0

どうすればいいですか?私のコードでそれを表示できますか? – SwiftDeveloper

+0

私が書いた解決策に関する具体的な質問はありますか? –

関連する問題