How do I order my images in my photosNSMutable arr

2019-08-07 04:34发布

问题:

//
//  ViewController.swift
//  Fashun
//
//  Created by Alex Macleod on 20/10/14.
//  Copyright (c) 2014 Alex Macleod. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

var collectionView: UICollectionView?

var instanceOfCustomObject: CustomObject = CustomObject()
var accessToken: NSString! = "14128167.52d0add.2fbff9669d9141099597cbb8d67764a4"
var userDefaults: NSUserDefaults!
let colorWheel = ColorWheel()
var photoCount: Int! = 0
let photos = NSMutableArray()

override func viewDidLoad() {

    super.viewDidLoad()

//    userDefaults = NSUserDefaults.standardUserDefaults()
//    self.accessToken = userDefaults!.objectForKey("accessToken") as NSString
//    println(self.accessToken)

//        instanceOfCustomObject.someProperty = "Hello World"
//        var accessToken : NSString? = NSString(instanceOfCustomObject.accessToken)
//        println(accessToken)
//        instanceOfCustomObject.authorize()

// Do any additional setup after loading the view, typically from a nib.
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
//        layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
    layout.itemSize = CGSize(width: 124, height: 124)
    layout.minimumInteritemSpacing = 1.0
    layout.minimumLineSpacing = 1.0
    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    collectionView!.dataSource = self
    collectionView!.delegate = self
    collectionView!.registerClass(Cell.self, forCellWithReuseIdentifier: "Cell")
    collectionView!.backgroundColor = UIColor.whiteColor()
    self.view.addSubview(collectionView!)

    getData()
//    imageCount()

}

    func getData() -> Void {

        let tuulavintageUrl = NSURL(string:"https://api.instagram.com/v1/users/7522782/media/recent/?access_token=\(self.accessToken)")
        let wendyslookbookUrl = NSURL(string:"https://api.instagram.com/v1/users/14454619/media/recent/?access_token=\(self.accessToken)")

//        let sharedSession = NSURLSession.sharedSession()
//        let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(baseUrl!, completionHandler: { (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in

            //            var urlContents = NSString.stringWithContentsOfURL(location, encoding: NSUTF8StringEncoding, error: nil)
            //            println(urlContents)

            let tuulavintageData = NSData(contentsOfURL: tuulavintageUrl!)
            let wendyslookbookData = NSData(contentsOfURL: wendyslookbookUrl!)

            if (tuulavintageData != nil) & (wendyslookbookData != nil) {

                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {

                    let tuulavintageDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(tuulavintageData!, options: nil, error: nil) as NSDictionary
                    let wendyslookbookDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(wendyslookbookData!, options: nil, error: nil) as NSDictionary
//                    println(tuulavintageDictionary)
                    var tuulavintageImageResponse = tuulavintageDictionary.valueForKeyPath("data.images.standard_resolution.url") as NSArray
                    var tuulavintageTimeResponse = tuulavintageDictionary.valueForKeyPath("data.created_time") as NSArray
//                    println(tuulavintageTimeResponse)
                    var wendyslookbookImageResponse = wendyslookbookDictionary.valueForKeyPath("data.images.standard_resolution.url") as NSArray
                    var wendyslookbookTimeResponse = wendyslookbookDictionary.valueForKeyPath("data.created_time") as NSArray
                    println(wendyslookbookTimeResponse)

                    for imageUrls in tuulavintageImageResponse {

                        var imageUrlsAsStrings: NSString = imageUrls as NSString
                        var imageAsNsurls = NSURL(string: imageUrlsAsStrings)

                        var err: NSError?
                        var imageData :NSData = NSData(contentsOfURL: imageAsNsurls!,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)!
                        self.photos.addObject(UIImage(data:imageData)!)
//                        println(self.photos)

                    }

                    for imageUrls in wendyslookbookImageResponse {

                        var imageUrlsAsStrings: NSString = imageUrls as NSString
                        var imageAsNsurls = NSURL(string: imageUrlsAsStrings)

                        var err: NSError?
                        var imageData :NSData = NSData(contentsOfURL: imageAsNsurls!,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)!
                        self.photos.addObject(UIImage(data:imageData)!)
//                        println(self.photos)

                    }

                    dispatch_async(dispatch_get_main_queue(), { () -> Void in

                        self.photoCount = tuulavintageImageResponse.count + wendyslookbookImageResponse.count as Int

                        self.collectionView?.reloadData()

                    })
                })

            } else {

                let networkIssueController = UIAlertController(title: "Error", message: "Something went wrong get a better phone you pleb!", preferredStyle: .ActionSheet)
                let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil)
                networkIssueController.addAction(okButton)
                let cancelButton = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
                networkIssueController.addAction(cancelButton)

                self.presentViewController(networkIssueController, animated: true, completion: nil)

                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    //Stop refresh animation

                })
            }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return photoCount
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as Cell
    //                println(photos)
    //            cell.textLabel.text = "Text"
        cell.imageView.image = photos.objectAtIndex(indexPath.row) as? UIImage
    //    cell.photo = self.photos[indexPath.row] as? NSDictionary
        cell.imageView.backgroundColor = colorWheel.randomColor()

        return cell
    }
}

As you can see I am making a call to instagram's API for their 20 most recent pictures for two separate users "tuulavintage" and "wendyslookbook". I then parse the data for the imageUrls, put them into two separate for in loops where I take those imageUrls and change them to UIImages and put them inside the "let photos = NSMutableArray()". Then I add the UIimages to my collection view cell "cell.imageView.image = photos.objectAtIndex(indexPath.row) as? UIImage"

I also count my parsed NSdictionary response like so "self.photoCount = tuulavintageImageResponse.count + wendyslookbookImageResponse.count as Int". So I can tell my collection view how many cells to make

You can also see here (inside the global main que) "var tuulavintageTimeResponse = tuulavintageDictionary.valueForKeyPath("data.created_time") as NSArray"

and here

"var wendyslookbookTimeResponse = wendyslookbookDictionary.valueForKeyPath("data.created_time") as NSArray"

I parse my NSDictionary response to retrieve an array of unixtimecode for each image but they aren't connected.

My question is how to I order these photos being displayed in my collection view by the time they were posted using the unixtimecode I can retrieve? I have a feeling I need to match up the UIimage's with their specific timecode, then somehow tell my collection view to order them by unixtime.

Thanks in advance.

回答1:

well you dont have to create a file but is good practice to keep things nice and neat.

try either in the same controller file but outside of your controller definition or inside your new Swift file.

class IGPhotoContainer  {

   var image: UIImage!
   var timestamp: String = ""   

   //Your constructor can be like this 
   init() {

   }

   //or overload it with 2 params for your convenience. 
   init(newimage: UIImage, newtime: String){

      this.image = newimage
      this.timestamp = newtime

   }

}

if you do it in a seperate File remember to add this line of code at the beginning of your new file.

import UIKit