我有一个UICollectionView和一个休息api。我获取我的数据并将其保存到我创建的实体对象的数组中。我有实体对象代表用户,两个用户之间的连接和通知(因此用户可以在用户之间建立连接)。
我在UICollectionView中显示我的所有数据,UICollectionView有3个部分用于用户配置文件,通知以及他与其他用户的连接。每个人都有自己的原型单元格,并有自己的自定义类。
当我加载ViewController并开始更新数据(从api获取)时,我保存一个哈希来跟踪数据是否已更改。如果它已朝当前显示的数据改变,我将我的新数据对象保存到我的数据模型并调用方法" updateUI()"在我的ViewController。
到目前为止一切顺利,一切正常 - 但我希望我的CollectionView能够进行动画更新。
我通过互联网搜索并了解到CollectionView已经有添加和删除单元格的方法。但在我的情况下,我无法跟踪我的数据是如何更改的,我只知道如果哈希值发生了变化,它已经改变了。
所以当我打电话给" reloadData()"在我的" updateUI()" -method中,整个CollectionView闪烁,更新非常难看。
如何跟踪我的数据的更改方式,或者如何在我的" updateUI()" -method中显示到CollectionView时为datachange设置动画?
更新
在这里开始使用一些代码是我的数据处理程序,它包含我的视图的所有数据:
class DataHandler {
static var connections : [Connection] = []
static var ownProfile : User?
static var notifications : [Notification] = []
static var connectionsHash : String? = nil
static var ownProfileHash : String? = nil
static var notificationsHash : String? = nil
static var overviewHash : String? = nil
//plus getter and setter for every attribute
}
这就是我将我的json对象从api存储到我的数据处理程序中的方法,例如通知:
var notifications : [Notification] = []
for (_,notification):(String, JSON) in dataObject["notifications"] {
let notificationObj = Notification(json: notification)
notifications.append(notificationObj)
}
DataHandler.setNotifications(notifications)
在我的View Controller中,我使用DataHandler中的数据设置单元格:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell : UICollectionViewCell!
let notificationCell = collectionView.dequeueReusableCellWithReuseIdentifier("NotificationCell", forIndexPath: indexPath) as! NotificationCell
let ownProfileCell = collectionView.dequeueReusableCellWithReuseIdentifier("OwnProfileCell", forIndexPath: indexPath) as! OwnProfileCell
let overviewUserCell = collectionView.dequeueReusableCellWithReuseIdentifier("OverviewUserCell", forIndexPath: indexPath) as! OverviewUserCell
switch indexPath.section {
case 0:
//setting up cell for notification
//with data from DataHandler
cell = notificationCell
case 1:
//setting up cell for own profile
//with data from DataHandler
cell = ownProfileCell
case 2:
//setting up cell for connected user
//with data from DataHandler
cell = overviewUserCell
default: break
}
return cell
}
我的api的典型回应如下:
{
"success": true,
"data": {
"notifications": [
{
"id": 6,
"lastAlarm": 1460493400,
"alarmDelay": 0,
"routine": 20000,
"master": {
"email": "*********",
"id": 12,
"created": 1454117165,
"imageUrl": "http://192.168.2.171:9999/profileimages/4.jpg",
"name": "**********",
"lastReport": 1460857863
},
"active": false
}
],
"connections": [
{
"id": 3,
"slave": {
"email": "*********",
"id": 12,
"created": 1454117165,
"imageUrl": "http://192.168.2.171:9999/profileimages/4.jpg",
"name": "**********",
"lastReport": 1460857863
},
"alarmDelay": 20000,
"lastAlarm": 1460493400,
"routine": 2000,
"active": true
},
{
"id": 4,
"slave": {
"email": "********",
"id": 13,
"created": 1454957407,
"imageUrl": "http://192.168.2.171:9999/profileimages/5.jpg",
"name": "*******",
"lastReport": 0
},
"alarmDelay": 2000,
"lastAlarm": 1460493400,
"routine": 200,
"active": true
}
],
"profile": {
"id": 11,
"shortestInterval": 300,
"imageUrl": "http://192.168.2.171:9999/profileimages/3.jpg",
"email": "********",
"created": 1454117103,
"name": "******",
"lastReport": 1461674777
}
},
"hash": "1c402ff86c8a3f9b7c0b2376d736fe47",
"error": null
}
当我成功从api接收数据时,我在ViewController中调用了updateUI方法:
func updateUI(animated : Bool) {
self.userCollectionView.reloadData()
}
我也为单元格制作了一些动画,但只是首先加载:
func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
if(duration == 0.5) {
cell.layer.opacity = 0.0
UIView.animateWithDuration(duration, animations: {
cell.layer.opacity = 1.0
})
}
}