ios 上的 SqlClient 在函数中的所有其他代码之后执行

SqlClient on ios executes after all other code in function

我正在编写 IOS 使用此项目的应用程序:https://github.com/martinrybak/SQLClient。我在使用以下代码与 SQL 通信时遇到问题。它不会在第一次遇到 connect 函数时执行。它转到下一行,在 viewDidLoad 中完成所有代码后,它返回到我的连接方法,连接成功。如何让它先执行它的代码,然后再执行所有其他代码? swift 和 ios 编程中有什么我还不明白的吗?

  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()

        }

移动你的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 将闭包作为参数。这清楚地表明这些函数本质上是异步的,并且将异步执行 args。所以很明显你不能把它写成下一行来连接并在连接完成执行后执行。

编辑:

在 connect/execute 中调用 DoSomethingElse() 是处理这种情况的唯一方法吗?没有。

我可以考虑的可能解决方案:

  1. 可以使用KVO。 : 当 connect/execute 更新数据源时,将观察者设置为您的数据源,您可以调用您的 DoSomethingElse。如果你问我,我更喜欢更简洁的方法:)

  2. 使用 Semaphoresdispatch_semaphores(比信号量更好)来阻塞线程:根本不是建议的解决方案!!使用 semaphore/dispatch_semaphores 阻塞主线程可能会导致 iOS 您的应用因无响应而终止,并可能提供最差的用户体验。

  3. 使用Dispatch_Group:Dispatch_Group用于监听独立块的完成。这个可以考虑。但我更喜欢从闭包内部调用方法。保持代码更简洁:)