如何按 NSDate 的顺序将对象插入数组?
How can I insert objects into an array in order of NSDate?
我有一种方法可以加载在用户配置文件的图库中使用的图像。使用我的数据库中的 "updatedPhotoAt" 列按降序加载图像。
"updatedPhotoAt" 列的目的是允许用户设置默认图像。只有当用户滑动图像并点击 "default" 按钮时,此列才会更新。 "updatedPhotoAt" 列具有最新日期的图像是默认图像。
这是我的代码:
func loadPhotoData() {
pageViews = []
pageImages = []
let query = PFQuery(className: "UserImages")
query.whereKey("user", equalTo: PFUser.currentUser())
query.addDescendingOrder("updatedPhotoAt")
query.findObjectsInBackgroundWithBlock { (objects: Array!, error: NSError!) -> Void in
if error != nil {
println("0 images found")
} else {
for object in objects as Array {
var imgDate = object["updatedPhotoAt"] as NSDate
println("1: \(imgDate)")
var imageFile = object["image"] as PFFile
var imgView = PFImageView()
imgView.file = imageFile
imgView.loadInBackground({ (image: UIImage!, error: NSError!) -> Void in
if error != nil {
//error alert
} else {
self.pageImages.append(image)
var imgDate = object["updatedPhotoAt"] as NSDate
println("2: \(imgDate)")
如您所见,当我查询数据库时,我确保使用 "updatedPhotoAt" 列按降序返回结果。在我的块中,我打印了此列的日期值,以便我可以查看是否一切正常。
最初是:
1: 2015-01-30 12:15:54 +0000
1: 2015-01-22 10:23:00 +0000
1: 2015-01-14 10:19:00 +0000
但是在 imgView 块中他们失去了顺序:
2: 2015-01-22 10:23:00 +0000
2: 2015-01-14 10:19:00 +0000
2: 2015-01-30 12:15:54 +0000
这意味着我的默认图像只是偶然显示,并且图像始终以随机顺序显示在用户的照片库中(该库是一个滚动视图,允许用户水平滚动浏览图像。默认图像应始终显示在第一位在列表中)。
我发现问题是由 imgView 块引起的。有什么方法可以保持图像的顺序?
您不能指望您开始的 imgView.loadInBackground
个异步进程都以与它们开始时相同的顺序完成。
做一些事情,比如用 NSNull
填充您需要在 pageImages
中使用的所有插槽,然后捕获您应该用块中的每个图像填充的索引并替换该项目索引而不只是追加。
此外,您可能应该限制同时开始的下载数量。尽量不要同时 运行 超过 4 件事。
这个挑战打击了我的信心,但有了上面 Wain 的解决方案和一些耐心,我坚持了一整天,最终想出了一个似乎非常有效的解决方案。
代码:
func loadPhotoData() {
pageViews = []
pageImages = []
let query = PFQuery(className: "UserImages")
query.whereKey("user", equalTo: PFUser.currentUser())
query.addDescendingOrder("updatedPhotoAt")
query.findObjectsInBackgroundWithBlock { (objects: Array!, error: NSError!) -> Void in
if error != nil {
println("0 images found")
} else {
//index to assign to imgview tag to keep track of image in block
var idx = -1
var imageDictionary = Dictionary<Int, UIImage>()
for object in objects as Array {
idx++
var imageFile = object["image"] as PFFile
var imgView = PFImageView()
imgView.tag = idx
imgView.file = imageFile
imgView.loadInBackground({ (image: UIImage!, error: NSError!) -> Void in
if error != nil {
} else {
//store images in array for counting later
self.pageImages.append(image)
//store image index and image as dictionary value
imageDictionary[imgView.tag] = image
}
if objects.count == self.pageImages.count {
let sortedKeysAndValues = sorted(imageDictionary) { [=10=].0 < .0 }
println(sortedKeysAndValues)
for (k,v) in Array(sortedKeysAndValues).sorted({[=10=].0 < .0}) {
println("\(k):\(v)")
self.pageImages[k] = v
}
打印日志:
[(0, <UIImage: 0x7fd5dac1df60>), (1, <UIImage: 0x7fd5d9455390>), (2, <UIImage: 0x7fd5da86a750>)]
0:<UIImage: 0x7fd5dac1df60>
1:<UIImage: 0x7fd5d9455390>
2:<UIImage: 0x7fd5da86a750>
我有一种方法可以加载在用户配置文件的图库中使用的图像。使用我的数据库中的 "updatedPhotoAt" 列按降序加载图像。
"updatedPhotoAt" 列的目的是允许用户设置默认图像。只有当用户滑动图像并点击 "default" 按钮时,此列才会更新。 "updatedPhotoAt" 列具有最新日期的图像是默认图像。
这是我的代码:
func loadPhotoData() {
pageViews = []
pageImages = []
let query = PFQuery(className: "UserImages")
query.whereKey("user", equalTo: PFUser.currentUser())
query.addDescendingOrder("updatedPhotoAt")
query.findObjectsInBackgroundWithBlock { (objects: Array!, error: NSError!) -> Void in
if error != nil {
println("0 images found")
} else {
for object in objects as Array {
var imgDate = object["updatedPhotoAt"] as NSDate
println("1: \(imgDate)")
var imageFile = object["image"] as PFFile
var imgView = PFImageView()
imgView.file = imageFile
imgView.loadInBackground({ (image: UIImage!, error: NSError!) -> Void in
if error != nil {
//error alert
} else {
self.pageImages.append(image)
var imgDate = object["updatedPhotoAt"] as NSDate
println("2: \(imgDate)")
如您所见,当我查询数据库时,我确保使用 "updatedPhotoAt" 列按降序返回结果。在我的块中,我打印了此列的日期值,以便我可以查看是否一切正常。
最初是:
1: 2015-01-30 12:15:54 +0000
1: 2015-01-22 10:23:00 +0000
1: 2015-01-14 10:19:00 +0000
但是在 imgView 块中他们失去了顺序:
2: 2015-01-22 10:23:00 +0000
2: 2015-01-14 10:19:00 +0000
2: 2015-01-30 12:15:54 +0000
这意味着我的默认图像只是偶然显示,并且图像始终以随机顺序显示在用户的照片库中(该库是一个滚动视图,允许用户水平滚动浏览图像。默认图像应始终显示在第一位在列表中)。
我发现问题是由 imgView 块引起的。有什么方法可以保持图像的顺序?
您不能指望您开始的 imgView.loadInBackground
个异步进程都以与它们开始时相同的顺序完成。
做一些事情,比如用 NSNull
填充您需要在 pageImages
中使用的所有插槽,然后捕获您应该用块中的每个图像填充的索引并替换该项目索引而不只是追加。
此外,您可能应该限制同时开始的下载数量。尽量不要同时 运行 超过 4 件事。
这个挑战打击了我的信心,但有了上面 Wain 的解决方案和一些耐心,我坚持了一整天,最终想出了一个似乎非常有效的解决方案。
代码:
func loadPhotoData() {
pageViews = []
pageImages = []
let query = PFQuery(className: "UserImages")
query.whereKey("user", equalTo: PFUser.currentUser())
query.addDescendingOrder("updatedPhotoAt")
query.findObjectsInBackgroundWithBlock { (objects: Array!, error: NSError!) -> Void in
if error != nil {
println("0 images found")
} else {
//index to assign to imgview tag to keep track of image in block
var idx = -1
var imageDictionary = Dictionary<Int, UIImage>()
for object in objects as Array {
idx++
var imageFile = object["image"] as PFFile
var imgView = PFImageView()
imgView.tag = idx
imgView.file = imageFile
imgView.loadInBackground({ (image: UIImage!, error: NSError!) -> Void in
if error != nil {
} else {
//store images in array for counting later
self.pageImages.append(image)
//store image index and image as dictionary value
imageDictionary[imgView.tag] = image
}
if objects.count == self.pageImages.count {
let sortedKeysAndValues = sorted(imageDictionary) { [=10=].0 < .0 }
println(sortedKeysAndValues)
for (k,v) in Array(sortedKeysAndValues).sorted({[=10=].0 < .0}) {
println("\(k):\(v)")
self.pageImages[k] = v
}
打印日志:
[(0, <UIImage: 0x7fd5dac1df60>), (1, <UIImage: 0x7fd5d9455390>), (2, <UIImage: 0x7fd5da86a750>)]
0:<UIImage: 0x7fd5dac1df60>
1:<UIImage: 0x7fd5d9455390>
2:<UIImage: 0x7fd5da86a750>