2014-09-12 52 views
0

我正在使用集合視圖來顯示從服務器接收的數據。返回預訂的JSON數組是像這樣:將NSIndexPath映射到數據標識符

[ 
    { 
     "id": 13644766, 
     "check_in": "2014-04-22", 
     "check_out": "2014-04-29", 
     "property_id": 1980 
    }, 
    { 
     "id": 13644763, 
     "check_in": "2014-04-22", 
     "check_out": "2014-04-29", 
     "property_id": 1978 
    }, 
    { 
     "id": 13644761, 
     "check_in": "2014-04-22", 
     "check_out": "2014-04-29", 
     "property_id": 2591 
    }, 
    { 
     "id": 13644764, 
     "check_in": "2014-04-22", 
     "check_out": "2014-04-29", 
     "property_id": 1978 
    } 
] 

我使用的集合視圖中顯示的數據,並必須實現UICollectionViewDataSource協議。更具體地說,一個部分擁有相同的property_id的所有預訂。所以我不得不做一個數據轉換將json數組映射到節和項。在斯威夫特後deserializingJSON和數據轉換它看起來像這樣(關鍵是PROPERTY_ID和價值是預訂的該PROPERTY_ID數組):

[ 
    1980: [["id": 13644766, "check_in": "2014-04-22", "check_out": "2014-04-29"]], 
    1978: [ 
      ["id": 13644763, "check_in": "2014-04-22", "check_out": "2014-04-29"] 
      ["id": 13644764, "check_in": "2014-04-22", "check_out": "2014-04-29"] 
     ], 
    2591: [["id": 13644761, "check_in": "2014-04-22", "check_out": "2014-04-29"]] 
] 

但我想保持一個簡單的數組在模型層,而而不是數組字典,因爲它比在數組字典上更容易對其執行CRUD操作。

更一般地,就是我要問的是:我怎麼可以處理數據從型號格式到視圖控制器(必需的數據源方法numberOfSectionsInCollectionView:collection:numberOfItemsInSection:collectionView:cellForItemAtIndexPath:)。

我在執行數據轉換的預訂數組上有一個只讀的計算屬性。但它可能會影響性能。如果計算出來的屬性不是一個選項,我怎樣才能保持這兩個數據結構同步呢?

+1

@Rob Napier在幾天前寫了一篇關於「扁平化拼圖」的文章。看看它[這裏](http://robnapier.net/flatmap)。 – 2014-09-12 12:51:22

+0

你會考慮使用CoreData來存儲這些信息嗎? – pbasdf 2014-09-12 13:01:07

+0

@POB謝謝,我正在閱讀。 – jamiltz 2014-09-12 13:02:52

回答

1

首先,我強烈建議您將字典數組轉換爲對象數組。 JSON應該被解析爲模型對象,而不是字典。我一直在撰寫關於這種解析的系列文章,從Functional Wish Fulfillment開始,但是您可以使用任何您想要解析的技術。只需將它放入對象中(通常是Swift中的結構)。然後你會有你的簡單數組。除此之外,在各種可可圈中解決「我該如何展示這個」的越來越多的選擇是從傳統的MVC架構到MVVM架構的過渡。在MVVM體系結構中,您可以在ViewController和Model之間添加一個額外的「View Model」層。 ViewModel的工作是將數據按照顯示圖層希望它所處的形式進行處理。一旦在模型中有良好的對象,這可能或可能不需要。但是,如果你的模型設計不完全符合你的視圖需求,ViewModel是一個好的中介。

+0

謝謝我將研究JSON解析。理想情況下,模型的類型應該是[Booking],但是在數據轉換之後,它會[String:[Booking]]將相應的部分/項目信息傳遞給'numberOfSectionsInCollectionView:','collectionView:numberOfItemsInSection:'和'collectionView:cellForItemAtIndexPath :'而performBatchUpdates方法和RESTful端點通常是對_raw_數據更容易執行的CRUD操作。這可能就是ReactiveCocoa來保持模型和_transformed_數據同步的地方嗎? – jamiltz 2014-09-12 13:25:35

+1

ReactiveCocoa當然是這裏的一個選項,但是您可以創建沒有該對象的VM對象。 MVVM與Reactive編程完全分離,儘管它們很受歡迎一起使用。在這裏描述的情況下,我肯定會使用VM對象。你的模型 - >視圖邏輯可能會很複雜,並且把它放到它自己的類中更容易。在頁面I鏈接和稍後的帖子中討論的功能工具非常適合這些類型的數據轉換。 – 2014-09-12 13:28:08