swift - 如何从 Haneke 的异步获取方法返回值

标签 swift asynchronous closures completionhandler haneke

我正在尝试解析我使用 Haneke Swift 缓存的一些数据。我已经缓存了数据并编写了解析器来完成此操作。此解析器位于名为 AssembleCalendar() 的单独类中。

使用 Haneke 的 example code对于抓取,我已经尝试完全失败地从闭包中实际返回一个值。

我的尝试

func getScheduledItems() -> [ScheduledItem] {
    
    var scheduledItem = [ScheduledItem]() // initialize array

    let cache = Shared.dataCache
    cache.fetch(key: "CalendarData").onSuccess { data in
        
        scheduledItem = AssembleCalendar().assimilate(data) // update array
        print(scheduledItem) // array returns expected value
        
    }

    print(scheduledItem) // array returns nil
    return scheduledItem // returns nil
}

我所知道的

我知道这是一个异步问题。我的代码没有等待我的 AssembleCalendar() 解析器完成。它只是运行每一行并在我的 scheduledItem 收到值之前很久就返回 nil 。我尝试了很多很多解决方案并在线阅读了很多示例,但我不知道如何在这种情况下从此闭包中检索值。

我的问题

如何让 .fetch() 在我的函数命中 nil 之前返回一个值?


更新:

这是我在上下文中的代码:

class Schedule {

    var items : [ScheduledItem]
    
    init() {
        items = getScheduledItems() // Schedule.getScheduledItems()
    }
    
    func getScheduledItems(completion: (items: [ScheduledItem]) -> ()) {
        
        var scheduledItem = [ScheduledItem]() // initialize array
        
        let cache = Shared.dataCache
        cache.fetch(key: "CalendarData").onSuccess { data in
            
            scheduledItem = AssembleCalendar().assimilate(data) // update array
            print(scheduledItem) // array returns expected value
            completion(items: scheduledItem)
            
        }
    }
}

最佳答案

Fetch() 使用完成处理程序,这意味着其中调用的代码块实际上是在您的 return 语句执行后执行的。这就是它返回零的原因。为了解决这个问题,您可以使用自己的完成处理程序来返回信息:

class Schedule {

    var items = [ScheduledItem]()

    init(items: [ScheduledItem]) {
        self.items = items
    }

    class func getScheduledItems(completion: (items: [ScheduledItem]) -> ()) {

        var scheduledItem = [ScheduledItem]() // initialize array

        let cache = Shared.dataCache
        cache.fetch(key: "CalendarData").onSuccess { data in

            scheduledItem = AssembleCalendar().assimilate(data) // update array
            print(scheduledItem) // array returns expected value
            completion(items: scheduledItem)

        }
    }
}

然后使用这个初始化类:

Schedule.getScheduledItems { (items) -> () in
    var schedule = Schedule(items: items)
}

关于swift - 如何从 Haneke 的异步获取方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32509392/

相关文章:

c# - 此异步方法缺少 'await' 运算符,将同步运行

swift - 在网络服务调用期间部分应用转发器

javascript - 为什么这个 javascript 闭包没有像我希望的那样工作?

function - 支持词法范围 ScriptBlock 参数(例如Where-Object)

ios - 无法将值写入 firebase Swift 3

swift - 仅当单击 tableview swift 时才更新 tableview

ios - 如何在 swift 中读取预加载的 sqlite 数据库

javascript - NodeJS 函数返回数据的正确方法

javascript - React 中的异步渲染

ios - 在启动时加载并呈现第二个 View Controller