如何从 Haneke 的异步 fetch 方法返回值

Posted

技术标签:

【中文标题】如何从 Haneke 的异步 fetch 方法返回值【英文标题】:How to return values from Haneke's async fetch method 【发布时间】:2015-09-10 18:39:45 【问题描述】:

我正在尝试解析一些我使用 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() 解析器完成。它只是运行每一行并在我的 scheduleItem 收到值之前返回 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)
            
        
    

【问题讨论】:

如果您将 ScheduledItem 数组传递给 init 函数,为什么不将其设置为 classes items 变量,而不是调用函数来获取它们?或者如果您确实需要使用该函数,请在调用 Schedule 的 init 函数之前执行此操作 忽略该行,这是临时解决方法的一部分,因此我可以继续开发,我将删除该行 我知道您在这里尝试使用工厂方法,但在这种情况下,我认为这不是正确的方法。如果您需要以异步方式获取数据,那么我会在实例化类之前调用​​它。我会修改我的答案给你看。 感谢 Swinny,我正在查看您关于此主题的其他一些有用的答案。 没问题,我已经更新了答案以显示可能的解决方案 【参考方案1】:

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

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)

【讨论】:

我在 Xcode 7 中遇到了几个错误。1.) ':' 之后的预期参数类型 2.) 函数声明体中的预期 ''。 你在哪条线上? 我还更新了我的答案,说明了如何实现这一点。 更新了我的主帖,我正在尝试用这个函数初始化一个值 请注意,我刚刚更新了我的答案,默认将 items 设为空数组,以便编译

以上是关于如何从 Haneke 的异步 fetch 方法返回值的主要内容,如果未能解决你的问题,请参考以下文章

异步 Javascript - 使用 Fetch 从 Weather.gov 获取数据以更新页面,但返回的承诺不再可用

如何从fetch获取响应值而不是没有值的promise?

如何显示从 fetch() 方法返回的图像 - react-native

在 Haneke 和 SwiftyJSON 之间转换 JSON

JS fetch API:如何使用一个异步函数从多个文件中获取内容?

使用 fetch 时如何从 MVC 控制器返回错误