如何在cellForRowAtIndexPath处暂停

时间:2015-03-31 19:48:05

标签: ios

我有一个包含x个部分的tableView,每个部分都有一行。在每一行中都有UIElements接受输入。输入来自核心数据。我之前已将输入附加到数组中,然后索引到数组中,但我想在cellForRowAtIndexPath中直接/单独设置它们。由于CD提取需要一些时间才能完成,我需要"暂停" cellForRowAtIndexPath(直到coreData fetch发送了一个已完成的NSNotification。) 如何在提取完成时暂停并仅设置UILabels等。我需要为每个部分执行此操作。

非常感谢任何帮助!谢谢。

我担心代码会混淆,所以请随意忽略它。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

    let dashboardCell = CellList.sharedInstance.dashboardCell[userIndexForItem[indexPath.section]] as DasboardCell

    dashBoardCellGlobalVariablesInstance.value = dashboardCell.cdFetchObject.queryCDValue()

    <--PAUSE AND WAIT FOR NSNOTIFICATION
    let value =  cell.contentView.viewWithTag(5) as UILabel
    value.text = dashBoardCellGlobalVariablesInstance.value
    <-- More UI ELEMENTS -->

    return cell

}

2 个答案:

答案 0 :(得分:2)

您需要重新构建您的方法。在每个单元格中填入您拥有的数据,是的,但想要在等待通知时阻止用户界面。

当您收到完成通知时,将有问题的数据存储到您的dataSource中,然后适当地重新加载tableView数据(正确的答案,如何,何地,何时依赖于应用程序)。

来自UITableView类参考(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/):

重新加载表格视图

  • reloadData
  • reloadRowsAtIndexPaths:withRowAnimation:
  • reloadSections:withRowAnimation:
  • reloadSectionIndexTitles

答案 1 :(得分:0)

我建议你这样设计你的课程

Class YourClass
{
    var valueArr = [String]()
    var cdValueObjectArr = [ValueObject]()
    let totalSession = 7
    @IBOutlet var tableView: UITableView!        

    func viewDidAppear()
    {
       let priority = DISPATCH_QUEUE_PRIORITY_HIGH
       dispatch_async(dispatch_get_global_queue(priority, 0)) {

       for i in 0...totalSession
       {
          String cdValue = cdFetchObjectArr[i].queryCDValue()
          valueArr.appendElement(cdValue)
          dispatch_async(dispatch_get_main_queue()) {
              tableView.reloadData()
          }

       }
     }

    }


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

    let dashboardCell = CellList.sharedInstance.dashboardCell[userIndexForItem[indexPath.section]] as DasboardCell


    if valueArr.size() > indexPath.session
    {
        let value =  cell.contentView.viewWithTag(5) as UILabel
        value.text = value[indexPath.session]

    }

    return cell
}


}