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() 是处理这种情况的唯一方法吗?没有。
我可以考虑的可能解决方案:
可以使用KVO
。 : 当 connect/execute 更新数据源时,将观察者设置为您的数据源,您可以调用您的 DoSomethingElse。如果你问我,我更喜欢更简洁的方法:)
使用 Semaphores
或 dispatch_semaphores
(比信号量更好)来阻塞线程:根本不是建议的解决方案!!使用 semaphore/dispatch_semaphores
阻塞主线程可能会导致 iOS 您的应用因无响应而终止,并可能提供最差的用户体验。
使用Dispatch_Group
:Dispatch_Group用于监听独立块的完成。这个可以考虑。但我更喜欢从闭包内部调用方法。保持代码更简洁:)
我正在编写 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() 是处理这种情况的唯一方法吗?没有。
我可以考虑的可能解决方案:
可以使用
KVO
。 : 当 connect/execute 更新数据源时,将观察者设置为您的数据源,您可以调用您的 DoSomethingElse。如果你问我,我更喜欢更简洁的方法:)使用
Semaphores
或dispatch_semaphores
(比信号量更好)来阻塞线程:根本不是建议的解决方案!!使用semaphore/dispatch_semaphores
阻塞主线程可能会导致 iOS 您的应用因无响应而终止,并可能提供最差的用户体验。使用
Dispatch_Group
:Dispatch_Group用于监听独立块的完成。这个可以考虑。但我更喜欢从闭包内部调用方法。保持代码更简洁:)