2015-12-21 146 views
1

我是新来的快速关闭。 我有这个代码,我不能从forloop的值提取封闭外的数组。如何从Swift结束返回值?

对不起这个问题,但我已经搜查stackflow但没有在这种特殊情况下的成功。

在此先感谢。

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) 
} 
+0

你不知道。你把逻辑放到闭包中,然后调用'reloadData'。这就对了。闭包是异步执行的,可能会在程序释放getData函数后被调用。 – luk2302

回答

1

您已经获得到阵列的数量,所以你需要做的就是重新加载的tableview后for循环的东西。

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

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

+0

谢谢Moriya! 你的答案伎俩。 感谢luk2302也。 – zumuha

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 
    } 
} 

希望这有助于