繁体   English   中英

如何从Swift闭包中返回值?

[英]How to return value from Swift closure?

我是快速关闭的新手。 我有这段代码,我不能从forloop中提取值到闭包之外的数组中。

抱歉这个问题,但我已经搜索了堆栈流,但是在这种情况下没有成功。

提前致谢。

var namesArray: [String] = []
var imagesArray: [String] = []
var timesArray: [String] = []
var placesArray: [String] = []

func getData(){
    //DATA SOURCE
    // Create request for user's Facebook data
    let request = FBSDKGraphRequest(graphPath: cmp.pageId, parameters: ["fields": "events"])

    // Send request to Facebook
    request.startWithCompletionHandler {

        (connection, result, error) in

        if error != nil {
            // Some error checking here
            print(error.debugDescription)
        } else
            if let pageData = result["events"] {
                print(result["events"]!!["data"]!![0]["name"])
                if let eventDetails = pageData!["data"] {

                    // EVENT DETAILS FETCH
                    for var i = 0; i < eventDetails!.count; i++
                    {
                        let fetchedEventName = eventDetails![i]["name"] as? String!
                        let fetchedEventTime = eventDetails![i]["start_time"] as? String!

                        if eventDetails?[i]["place"]??["name"] != nil {
                            if let fetchedEventPlace = eventDetails?[i]["place"]??["name"] {
                                self.placesArray.append(fetchedEventPlace! as! String)
                            }
                        } else {
                            self.placesArray.append("Lisbon")
                        }
                        self.namesArray.append(fetchedEventName!)
                        self.timesArray.append(fetchedEventTime!)
                    }
                    print("Name of event: \(self.namesArray)")
                }
            } else {
                print("Error.")
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    getData()
}

编辑:我想将获取的结果显示到已设置的表视图中。 这是tableview代码。

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCellWithIdentifier("previewCell") as? PreviewCell {

        var img: UIImage!

        let url = NSURL(string: imagesArray[indexPath.row])!
        if let data = NSData(contentsOfURL: url){
            img = UIImage(data: data)
        } else {
            img = UIImage(named: "ant")
        }

        cell.configureCell(img, title: namesArray[indexPath.row], time: timesArray[indexPath.row], place: placesArray[indexPath.row])

        return cell
    } else {
        return PreviewCell()
    }
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return namesArray.count
}

func addNewEvent(name: String, image: String, time: String, place: String)
{
    namesArray.append(name)
    imagesArray.append(image)
    timesArray.append(time)
    placesArray.append(place)
}

您已经将数字输入到数组中了,因此您需要做的就是在for循环之后重新加载tableview。

//end of for-loop
self.tableView.reloadData()

这样做的原因是request.startWithCompletionHandler的异步执行。 该块中的代码很可能在您的tableView已加载后执行,因此在获取数据后需要重新加载

如果需要从闭包中返回数据,则可以像这样在getData()方法上定义完成

func getData(completion:([DataType]) -> Void) {
    //process data
    let dataArray:DataType = []
    completion(dataArray)
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    getData { (completionData) -> Void in
        // process returned data 
    }
}

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM