gpt4 book ai didi

ios - Swift,从异步 block 返回值

转载 作者:行者123 更新时间:2023-11-28 10:25:26 25 4
gpt4 key购买 nike

对 iOS 开发非常陌生,我刚刚开始涉足 GCD,我已经阅读了几篇关于 SO 的文章并查阅了 Apple 的文档,但是我很难理解如何从“昂贵”的操作中设置返回值.

下面的函数将循环遍历 100K 用户(作为示例),在主线程上执行此操作显然会使 GUI 暂停几秒钟,因此在我的 UserList 类中,我建议在我的线程上异步执行此 block :

let queue = dispatch_queue_create("me.alexsims.user_queue", DISPATCH_QUEUE_CONCURRENT)

public func getUserById(userId: String, completionHandler: (result: User) -> ())
{
dispatch_async(queue)
{
for user in self.users {
if user.getUserId() == userId
{
completionHandler(result: user)
}
}
// Return an empty user object
completionHandler(result: User())
}
}

现在根据我的理解,应该返回 result 变量,然后我应该能够从我的主线程访问存储在其中的 User() 对象

但是,当我返回我的 Controller 并运行测试时:

var list   = UserList()
var a_user = User()

a_user = list.getUserByID(userId: "xyz", completionHandler: { (result) -> () in
println(result)
})

这会抛出错误 Could not find an overload for 'println' that accepts the supplied arguments,我猜那是因为我不在主队列中?所以我尝试:

a_user = list.getUserById(userId: "xyz", completionHandler: { (result) -> () in
dispatch_async(dispatch_get_main_queue()) {
println(result)
}
})

但是,我仍然得到同样的错误。我在这里做错了什么?

已解决正如 Daniel 所发现的,问题在于为 list.getUserByID 调用提供可选参数。将其更改为:

a_user = list.getUserById("abcde", completionHandler: { (result) -> () in
println(result)
})

println 错误消失了。

最佳答案

你的 Swift 类 User 需要实现 Printable 协议(protocol),这样它才能被 println 使用。

像这样:

Class User: Printable {
let name = "Bob"
var description: String {
return "User: \(name)"
}
}

阅读更多 Apple post

如果你觉得懒惰,让你的 User 类成为已经实现 Printable 协议(protocol)的 NSObject 的子类

编辑

快速搜索一下你的println错误转this up .不知道为什么错误会落到 println 但这里有一个修复:

尝试删除函数调用的第一个参数,在 Swift 中您不需要键入第一个参数以避免冗余:

a_user = list.getUserById(userId: "xyz...

应该是:

a_user = list.getUserById("xyz...

关于ios - Swift,从异步 block 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26995757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com