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

现在从我的理解, resultvariables应该返回,然后我应该能够访问从我的主线程存储在那里的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...