如何从Swift闭包中返回值?

时间:2015-12-21 21:50:35

标签: ios swift return closures

我是快速关闭的新手。 我有这个代码,我无法将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中。 下面是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)
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

如果您需要从闭包中返回数据,您可以在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 
    }
}

希望这有帮助