2017-04-11 69 views
0

我正在編寫使用此項目的IOS應用程序:https://github.com/martinrybak/SQLClient。使用下面的代碼與SQL進行通信時遇到問題。它不會在第一次執行連接功能時執行。它轉到下一行,並在viewDidLoad中創建所有代碼後,它返回到我的連接方法,連接成功。如何使它先執行代碼,然後再執行所有其他代碼?它是快速和ios編程我不明白嗎?ios上的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,execute需要閉包作爲參數。這清楚地表明這些函數本質上是異步的,並且會異步執行參數。所以顯然你不能把它寫成下一行來連接並執行一次連接完成執行。

編輯:

呼喚DoSomethingElse()內連接/執行是唯一的方式來處理這種情況?不。

可能的解決方案來考慮,我能想到:

  1. 您可以使用KVO。 :在連接/執行更新數據源時,將觀察者設置爲數據源,您可以調用DoSomethingElse。如果你問我,我更喜歡更清潔的方法:)

  2. 使用Semaphoresdispatch_semaphores(更好地比較信號量)來阻塞線程:完全沒有建議的解決方案!!用semaphore/dispatch_semaphores阻止主線程可能會導致iOS殺死我們的應用程序,使其無法響應並可能導致最糟糕的用戶體驗。

  3. 使用Dispatch_Group:Dispatch_Group用於監視獨立塊的完成情況。這可以考慮。但我更喜歡從封閉內部調用方法。保持代碼清潔:)

+0

這意味着從服務器獲取數據後發生的函數中的每個代碼都必須放在連接中? – Whencesoever

+0

而不是把每一個代碼,寫一個函數,使用數據,一旦從服務器獲取數據,你可以調用方法從連接:D和是的邏輯上,你應該把它放在連接 –

+0

可以告訴我爲什麼這返回5爲55?每個Integer只有1個字符 – Whencesoever

相關問題