Swift,从asynchronous块返回值
对于iOS开发来说,这是一个很新的东西,我刚刚开始涉足GCD,我已经阅读了几篇关于SO的文章,并且已经咨询了Apple的文档,但是我很难理解如何从“昂贵”的操作中设置返回值。
下面的函数将遍历总和100K用户(作为一个例子),在主线程上这样做显然会停止GUI几秒钟,因此在我的UserList类中,我build议在我的线程上asynchronous执行这个块:
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
variables应该返回,然后我应该能够访问从我的主线程存储在那里的User()
对象
但是,当我返回到我的控制器并运行testing时:
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) } })
不过,我仍然得到同样的错误。 我在这里做错了什么?
求解丹尼尔发现,问题是提供list.getUserByID
调用的可选参数。 将其更改为:
a_user = list.getUserById("abcde", completionHandler: { (result) -> () in println(result) })
println错误消失了。
您的Swift类User
需要实现Printable协议,以便println可以使用它。
像这样的东西:
Class User: Printable { let name = "Bob" var description: String { return "User: \(name)" } }
阅读更多在这个苹果职位
如果你感觉很懒,那么使你的User类成为已经实现了Printable协议的NSObject的一个子类
编辑
快速search你的println错误就能解决这个问题 。 不知道为什么错误通过println,但inheritance人修复:
尝试删除函数调用的第一个参数,在Swift中,不需要input第一个参数来避免冗余:
a_user = list.getUserById(userId: "xyz...
应该:
a_user = list.getUserById("xyz...