如何从Haneke的异步获取方法返回值 [英] How to return values from Haneke's async fetch method

查看:156
本文介绍了如何从Haneke的异步获取方法返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用 Haneke Swift 解析我缓存的一些数据。我缓存了数据,并写了解析器来完成这个。这个解析器在一个单独的类 AssembleCalendar()



使用Haneke的示例代码获取,我试着完全和utter失败实际上从闭包返回一个值。



我的尝试

  func getScheduledItems () - > [ScheduledItem] {

var scheduledItem = [ScheduledItem]()//初始化数组

let cache = Shared.dataCache
cache.fetch ).onSuccess {data in

scheduledItem = AssembleCalendar()。assimilate(data)//更新数组
print(scheduledItem)//数组返回期望值

}

print(scheduledItem)//数组返回nil
return scheduledItem //返回nil
}

我知道的



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



我的问题



如何在函数hits nil之前获取.fetch()返回值?


$ b b


更新



下面是我的代码:

  class Schedule {

var items:[ScheduledItem]

init(){
items = getScheduledItems()// Schedule.getScheduledItems()
}

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

var scheduledItem = [ScheduledItem]()//初始化数组

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

scheduledItem = AssembleCalendar()。assimilate(data)//更新数组
print(scheduledItem)//数组返回预期值
completion(items:scheduledItem)

}
}
}


解决方案

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

 类Schedule {

var items = [ScheduledItem]()

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

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

var scheduledItem = [ScheduledItem]()//初始化数组

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

scheduledItem = AssembleCalendar()。assimilate(data)// update array
print scheduledItem)//数组返回预期值
完成(items:scheduledItem)

}
}
}
pre>

然后使用下面的语句初始化类:

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


I'm trying to parse some data that I cached using Haneke Swift. I've cached the data and have written the parser to accomplish this. This parser is in a separate class called AssembleCalendar().

Using Haneke's example code for fetching, I've tried with complete and utter failure to actually return a value from the closure.

My attempt

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
}

What I know

I understand that this is an asynchronous issue. My code isn't waiting for my AssembleCalendar() parser to finish. It's just running each line and returns nil long before my scheduledItem receives a value. I've tried many, many solutions and read quite a few examples online but I cannot figure out how to retrieve a value from this closure in this scenario.

My question

How can I get .fetch() to return a value before my function hits nil?


update:

Here's my code in context:

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() is using a completion handler, this means that the block of code called in there is actually executing AFTER your return statement has been executed. This is why it is returning nil. To get around this, you can use your own completion handler to return the information:

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)

        }
    }
}

Then initialise the class using this:

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

这篇关于如何从Haneke的异步获取方法返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆