首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Haneke的异步获取方法返回值

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

Stack Overflow用户
提问于 2015-09-10 18:39:45
回答 1查看 457关注 0票数 1

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

使用Haneke的示例代码进行抓取,我尝试完全失败地从闭包返回一个值。

我的尝试

代码语言:javascript
复制
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接收值之前很久就返回0。我尝试了很多很多解决方案,并在网上阅读了不少示例,但在这个场景中,我想不出如何从这个闭包中检索值。

我的问题

如何让.fetch()在函数点击零之前返回一个值?

更新:

以下是我的上下文代码:

代码语言:javascript
复制
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)
            
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-10 20:16:55

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

代码语言:javascript
复制
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)

        }
    }
}

然后使用以下方法初始化类:

代码语言:javascript
复制
Schedule.getScheduledItems { (items) -> () in
    var schedule = Schedule(items: items)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32509392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档