2015-10-20 36 views
2

在我的課程中,我填充了表視圖並啓用用戶輸入之前,有多個資源Siesta對象,我希望所有這些對象都用數據加載。在Siesta中觀察多個資源

下面的代碼:

var trainees: Resource? { 
    didSet { 
     oldValue?.removeObservers(ownedBy: self) 

     trainees?.addObserver(self).addObserver(statusOverlay, owner: self).loadIfNeeded() 
    } 
} 

var points: Resource? { 
    didSet { 
     oldValue?.removeObservers(ownedBy: self) 

     points?.addObserver(self).addObserver(statusOverlay, owner: self).loadIfNeeded() 
    } 
} 

var exercises: Resource? { 
    didSet { 
     oldValue?.removeObservers(ownedBy: self) 

     exercises?.addObserver(self).addObserver(statusOverlay, owner: self).loadIfNeeded() 
    } 
} 

func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) { 
    tableView.reloadData() 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    self.trainees = DataManager.sharedInstance.api.trainees 
    self.points = DataManager.sharedInstance.api.points 
    self.exercises = DataManager.sharedInstance.api.exercises 
} 

所以,問題是什麼檢查,一切都已經在resourceChanged FUNC調用reloadData之前被加載的最佳方式。謝謝。

回答

0

選項1

如果您使用午睡的內置ResourceStatusOverlay,如果同樣的狀態重疊在觀察所有三種資源,然後覆蓋之前,不會所有三個加載消失。一種選擇是讓覆蓋物在加載時覆蓋所有內容,即使桌面視圖部分填充在下面也是如此。

選項2

如果你的邏輯斷裂,除非所有的數據存在,你可以檢查所有三個資源具有數據觸摸表視圖之前:

func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) { 
    if trainees.latestData != nil && points.latestData != nil && exercises.latestData != nil { 
     tableView.reloadData() 
    } 
} 

注意做這個即使在呼叫resource.wipe()之後,方式也會留下表格視圖。如果您使用service.wipeResources()登錄用戶,則即使註銷後,這也可能導致用戶數據保留在屏幕上。該解決方案將是填充要麼所有的數據或沒有一些數據結構,但在這兩種情況下調用reloadData()

func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) { 
    if trainees.latestData != nil && points.latestData != nil && exercises.latestData != nil { 
     dataToDisplayInTable = .......; 
    } else { 
     dataToDisplayInTable = []; 
    } 
    tableView.reloadData() 
} 

選項3

確保您的邏輯來處理資源,有或無數據,並填充表視圖增量作爲資源獲取填充:

func resourceChanged(resource: Siesta.Resource, event: Siesta.ResourceEvent) { 
    // This is made-up logic; insert your real logic here. 
    // Note that this example works because jsonArray returns [] 
    // for a resource with no data. 
    dataToDisplayInTable = trainees.jsonArray 
         + points.jsonArray 
         + exercises.jsonArray 

    tableView.reloadData() 
} 

因爲在表視圖慵懶細胞產生的,這種做法很少是性能問題。

+0

感謝您的精彩答案!我想我在這裏沒有什麼可以使用第一個選項。 – Rhuantavan

+1

不客氣。 ResourceStatusOverlay是初稿,沒有在任何可能的情況下(但只在它被使用的地方)進行過測試,所以請在Github上提交問題,如果它不能令人滿意地工作的話。 –