ios - Swift,从异步 block 返回值

标签 ios asynchronous swift

对 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/

相关文章:

ios - 如何在ios中显示不同时区的相同时差

ios - 以编程方式创建的 EZAudioPlot 不绘制

ios - [__NSArrayM objectAtIndex :]: index 9223372036854775807 beyond bounds [0 . 。 13]'

javascript - 将 javascript 参数从外部作用域传递到匿名回调函数

javascript - 如何将异步代码变成同步代码-nodejs?

ios - 关于 Swift 中 iPhone 闹钟应用程序中日期重复功能的问题

ios - 尝试使用 Swift 包管理器通过 HTTPS 将包添加到我的项目时身份验证失败

java - 等待任务完成而不阻塞 javafx 中的 UI

swift - 如何删除与不存在的变量相关的控制台错误

ios - 未调用 UIAlertView 委托(delegate)函数