2015-03-31 57 views
0

暫停我有一個用的tableView段的x個,每一個行。在每一行都有UIElements接受輸入。輸入來自核心數據。我以前將輸入追加到數組中,然後索引到數組中,但是我想直接/單獨在cellForRowAtIndexPath中設置它們。由於CD讀取需要一些時間才能完成,我需要「暫停」的cellForRowAtIndexPath(直到coreData取已發送NSNotification,它已完成。) 如何暫停,只有做當抓取設置UILabels等。我需要爲每個部分執行此操作。如何在的cellForRowAtIndexPath

任何幫助將非常感謝!謝謝。

我擔心的代碼將被搞亂,所以不必在意它。

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 

} 
+1

這不是一個良好的業績進行查詢,以CD每次的cellForRowAtIndexPath被稱爲......我建議你之前reloadData被稱爲 – 2015-03-31 19:53:01

+0

啊獲取所有的對象,因爲ReusableCell好嗎?對? – KML 2015-03-31 19:55:13

+0

不,因爲在NSManagedObjectContext中使用executeFetchRequest的單個提取比單獨提取每個對象花費的時間少。 – 2015-03-31 20:01:21

回答

2

您需要重新調整您的方法。填寫每個單元格的數據,是的,但你不要想要在您等待通知時阻止UI。

當您收到完成通知,有問題的數據存儲到你的數據源,然後適當地重新加載的tableView數據(正確的答案如何,在何處,都應用依賴時)。

從UITableView的類參考(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/):

重新加載表視圖

  • reloadData
  • reloadRowsAtIndexPaths:withRowAnimation:
  • reloadSections:withRowAnimation:
  • reloadSectionIndexTitles
+0

好的,所以 - 回過頭去存儲數組中的每個元素並在cellForRowAtIndexPath處編制索引?那是最好的方法呢? – KML 2015-03-31 20:02:23

+1

「正確」的答案取決於很多依賴於應用程序的事情,比如獲取了多少總體數據,平均獲取需要多長時間,在任何時間點需要多少內存等。例如,如果你願意,你仍然可以做一個懶惰的加載;將佔位符數據放入尚未加載的字段中,並在數據到達時告訴tableview更新到達的indexPath。這是您的用戶體驗的正確實施嗎?我無法告訴你那一個。 – 2015-03-31 20:08:03

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 
} 


} 
相關問題