【问题标题】:Return statement returns before information is receivedreturn 语句在收到信息之前返回
【发布时间】:2015-12-05 01:56:16
【问题描述】:

我的 swift 代码有点问题。结束返回语句在存储 JSON 值之前运行,因此它一直给我 nil。收到价值后如何退货?

func getArticleInfo(Id: String) -> String {
    let url = val1 + val2 + val3
    Alamofire.request(.GET, url).responseJSON { response in
        switch response.result {
        case .Success:
            if let value = response.result.value {
                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
                    let json = JSON(value)
                    let singleAsset = json["url"].string
                }
            }
        case .Failure(let error):
            print(error)
        }
    }
return singleAsset
}

感谢您对我遇到的其他问题的帮助。见下文 我试图让类别填充所有信息,然后在完成后调用 vc.displayCatName() 。但它做得太晚了,我必须刷新页面才能看到信息。

以上只是我将 JSON 值分配给填充 BELOW 类别的键。但是 vc.displayCatName() 是来自另一个视图控制器的函数,但它在填充类别值之前运行。因此,我看到这些值的唯一方法是,如果我使用 Pull to Refresh 手动刷新页面。所以我希望填充信息,然后 vc.displayCatName() 应该运行

                            self.getAsset(id!) { (result) -> Void in
                            print("this is result \(result)")
                            let categories = Categories (categoryName: catName, imageId: id, catIdNumber: catIdNumber, imageUrl: result)
                            vc.cats.append(categories)
                        }
                            }
                    }
                    dispatch_async(dispatch_get_main_queue()) {
                        vc.displayCatName()

                }

            }

【问题讨论】:

  • 当你已经在一个异步的completionHandler块中,为什么还需要使用dispatch_async
  • 嗯,你说得对。那么我应该删除调度吗?
  • 是的,因为它没有任何用处。
  • 这只是解决方案的一部分。正如@SnarfSnarf 所说,您正在进行异步调用,返回语句将在Alamofire.request 调用之后执行。
  • 我取出了dispatch,它仍然在完成/获取请求之前运行return语句

标签: ios swift alamofire dispatch


【解决方案1】:

这是因为您进行的调用本质上是异步的。而是考虑使用完成处理程序。

func getArticleInfo(Id: String, success: (String) -> Void ) {
    let url = "www.Test.com"
    Alamofire.request(.GET, url).responseJSON { response in
        switch response.result {
        case .Success:
            if let value = response.result.value {
                    let json = JSON(value)
                    let singleAsset = json["url"].string
                    success(singleAsset!)
            }
        case .Failure(let error):
            print(error)
            success("TEST")
        }
    }
}

打电话:

getArticleInfo("test") { (asset) -> Void in
        print(asset)
}

【讨论】:

  • 不,它没有。出于某种原因
  • 我已经编辑了我的代码,因此如果发现错误,它也会返回一些内容。代码在我这边运行良好,所以请提供一些关于它是如何失败的上下文。还可以考虑删除 Id: String 因为你似乎什么都不做。
  • 好吧,工作。我现在遇到的另一个问题是我使用了数据。但是我正在运行的另一件事给出了同样的问题,它在完成之前会令人兴奋
  • 我肯定会非常感谢您的帮助。有关其他问题,请参阅编辑后的帖子
  • 请将新问题作为单独的问题发布,以便未来的用户可以更清楚地搜索问题的答案。此外,如果您重新发布代码,请提供更多上下文。例如,如果您正在调用一个函数(比如displayCatName()),请发布函数定义。
猜你喜欢
  • 1970-01-01
  • 2021-02-06
  • 2013-05-05
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2015-02-27
  • 2022-12-09
相关资源
最近更新 更多