2017-04-11 8 views
0

私はこのプロジェクトを使用してiOSアプリケーションを書いています内の他のすべてのコードの後に​​実行されます。私は以下のコードでSQLとの通信に問題があります。初めて接続機能を満たすと実行されません。次の行に進み、すべてのコードがviewDidLoadで作成された後、connectメソッドに戻り、succesfulyを接続します。前にコードを実行し、前に他のコードを実行させるにはどうすればいいですか?それは私がまだ理解していない迅速かつイオスプログラミングの何かですか?SqlClientでは機能

override func viewDidLoad() { 
      super.viewDidLoad() 

      let client = SQLClient.sharedInstance() 


      client?.connect(Constants.serwerAdress, username: Constants.userName, password: Constants.password, database: Constants.databaseName) { 
       success in 

       if success { 
        client?.execute("select A FROM B") { 
         results in 

         for table in results as AnyObject! as! NSArray { 
          for row in table as AnyObject! as! NSArray { 

           for column in row as! NSDictionary { 

            print("\(column.key) = \(column.value)") 
           } 
          } 
         } 
         client?.disconnect() 
        } 
       } 
      } 

    DoSomethingElse() 

     } 

答えて

1

あなたのDoSomethingElseを成功の閉鎖に接続するように移動します。

override func viewDidLoad() { 
      super.viewDidLoad() 

      let client = SQLClient.sharedInstance() 


      client?.connect(Constants.serwerAdress, username: Constants.userName, password: Constants.password, database: Constants.databaseName) { 
       success in 

       if success { 
        client?.execute("select A FROM B") { 
         results in 

         for table in results as AnyObject! as! NSArray { 
          for row in table as AnyObject! as! NSArray { 

           for column in row as! NSDictionary { 

            print("\(column.key) = \(column.value)") 
           } 
          } 
         } 
         client?.disconnect() 
         DoSomethingElse() 
        } 
       } 
      } 

     } 

connectのようなコードのメソッドは、引数としてclosureをとります。これは明らかにこれらの関数が本質的に非同期であり、argsを非同期的に実行することを示しています。だから、明らかに、接続の完了後に接続して実行する次の行として書くことはできません。

EDIT:

が接続内/実行)(DoSomethingElseを呼び出しているが、このシナリオを処理するための唯一の方法ですか?いいえ。

  1. あなたはKVOを使用することができます:私はオフに考えることができ、考慮すべき

    可能な解決策。 :接続/実行時にDoSomethingElseと呼ばれるデータソースを更新するときは、オブザーバーをデータソースに設定します。あなたは私に言わせれば、私はより多くのクリーンなアプローチを好む:)

  2. 使用Semaphoresまたはdispatch_semaphores(より良いセマフォと比べて)スレッドをブロックする:すべての提案された解決策で!!。 semaphore/dispatch_semaphoresでメインスレッドをブロックすると、iOSが応答しなくなる可能性があり、最悪のユーザーエクスペリエンスをもたらす可能性があります。

  3. 使用Dispatch_Group:Dispatch_Groupは、独立したブロックの終了を監視するために使用されます。これは考えられる。しかし、私は閉鎖の内側からメソッドを呼び出す方が好きです。コードをきれいに保ちます:)

+0

つまり、サーバーからのデータを取得した後に発生するすべてのコードは、内部に挿入する必要があります。 Dとはい論理的にあなたが – Whencesoever

+0

むしろ、すべてのコードを置くよりも、データを使用して、データをサーバから取得されたら、あなたは接続からメソッドを呼び出すことができる関数を書きます5のための5?整数ごとに1つの文字のみ –

+0

あなたはなぜこの戻り私に言うことができる、それは内部の接続置くべきである: – Whencesoever

関連する問題