доступ к данным JSON за пределами закрытия в swift - PullRequest
0 голосов
/ 10 мая 2018

Я хотел бы знать, возможно ли это. В этом классе я получаю ответ JSON, response.bususiness позволяет мне получить доступ к ответу в закрытии. Однако моя главная цель - использовать этот ответ и представить его в виде таблицы. Но я не могу получить доступ к данным, когда пытаюсь вызвать их снова, даже после объявления класса var с тем же именем. Я знаю, что это как-то связано с основным потоком, но мне интересно, знают ли какие-нибудь обходные кодеры какие-либо обходные пути, я довольно нов в этом. Спасибо

class YelpTableView: UIViewController, UITableViewDataSource, UITableViewDelegate{




    var businesses = [CDYelpBusiness]()
    var names : String?



    override func viewDidLoad() {
        super.viewDidLoad()





        let yelpAPIClient = CDYelpAPIClient(apiKey: "MY-API-KEY")
        yelpAPIClient.cancelAllPendingAPIRequests()
        CDYelpFusionKitManager.shared.apiClient = yelpAPIClient

        CDYelpFusionKitManager.shared.apiClient.searchBusinesses(byTerm: "Bars", location: "Hollywood, California", latitude: nil, longitude: nil, radius: 10000, categories: [CDYelpBusinessCategoryFilter.bars], locale: CDYelpLocale.english_unitedStates, limit: 5, offset: 0, sortBy: CDYelpBusinessSortType.distance, priceTiers: [CDYelpPriceTier.twoDollarSigns], openNow: true, openAt: nil, attributes: nil) { (response) in

            if let response = response,
                let businesses = response.businesses,
                businesses.count > 0 {

                for business in (response.businesses)! {

                    self.names = business.name
                    print(self.names)

                  //  Prints
//                    Optional("Ever Bar")
//                    Optional("Melrose Umbrella")
//                    Optional("The Pikey")
//                    Optional("Velvet Margarita")
//                    Optional("Mama Shelter Rooftop Bar")
//                    Optional("Mama Shelter Rooftop Bar")


                }
            }

            print(self.names) // prints nil
            print(self.businesses) // print [ ]
        }

    }

1 Ответ

0 голосов
/ 10 мая 2018

Вам необходимо присвоить переменную locale businesses свойству класса.

CDYelpFusionKitManager.shared.apiClient.searchBusinesses(byTerm: "Bars", location: "Hollywood, California", latitude: nil, longitude: nil, radius: 10000, categories: [CDYelpBusinessCategoryFilter.bars], locale: CDYelpLocale.english_unitedStates, limit: 5, offset: 0, sortBy: CDYelpBusinessSortType.distance, priceTiers: [CDYelpPriceTier.twoDollarSigns], openNow: true, openAt: nil, attributes: nil) { (response) in
    if let response = response,
        let businesses = response.businesses,
        businesses.count > 0 {

        for business in (response.businesses)! {
            self.names = business.name
            print(self.names)
        }

        self.businesses = businesses
    }
}

Выше будет правильно обновлять вашу собственность. После этого вам нужно будет указать табличное представление для перезагрузки. Убедитесь, что перезагрузка выполнена в главной очереди.

Это делает ваш окончательный код примерно таким:

CDYelpFusionKitManager.shared.apiClient.searchBusinesses(byTerm: "Bars", location: "Hollywood, California", latitude: nil, longitude: nil, radius: 10000, categories: [CDYelpBusinessCategoryFilter.bars], locale: CDYelpLocale.english_unitedStates, limit: 5, offset: 0, sortBy: CDYelpBusinessSortType.distance, priceTiers: [CDYelpPriceTier.twoDollarSigns], openNow: true, openAt: nil, attributes: nil) { (response) in
    if let response = response,
        let businesses = response.businesses,
        businesses.count > 0 {

        for business in (response.businesses)! {
            self.names = business.name
            print(self.names)
        }

        self.businesses = businesses

        DispatchQueue.main.async {
            self.tablView.reloadData()
        }
    }
}
...