ios - 数据乱序

标签 ios swift flickr

我正在使用 Flickr API 获取集合中的所有相册,然后使用相册 ID 从中获取每个相册的主照片。它有效,但照片没有按顺序返回给我,因此每个相册的主照片与我收藏 View 中的相册标题不匹配。

func getPhotoCollection() {
        let collectionURLString = "https://api.flickr.com/services/rest/?method=flickr.collections.getTree&api_key={API_KEY}&collection_id=72157676119666248&user_id={USER_ID}&format=json&nojsoncallback=1"

        self.session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
        let task = self.session?.dataTask(with: URL(string: collectionURLString)!, completionHandler: { (data, response, error) in
            let json = self.getJSONFrom(urlString: collectionURLString)
            let collections = json["collections"]
            let collection = collections["collection"].arrayObject as! [[String:AnyObject]]
            for collectionObject in collection {
                let sets = collectionObject["set"] as! [[String: AnyObject]]
                for set in sets {
                    let albumId = set["id"] as! String
                    let albumTitle = set["title"] as! String
                    self.albumIds.append(albumId)
                    self.albumTitles.append(albumTitle)
                }
            }

            self.getAlbumPrimary()
        })

        task?.resume()
    }

func getAlbumPrimary() {
        for albumId in self.albumIds {
            let apiURLString = "https://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key={API_KEY}&photoset_id=\(albumId)&per_page=1&user_id={USER_ID}&format=json&nojsoncallback=1"

            self.session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
            let task = self.session?.dataTask(with: URL(string: apiURLString)!, completionHandler: { (data, response, error) in
                let json = self.getJSONFrom(urlString: apiURLString)
                let photos = json["photoset"]
                let photo = photos["photo"].arrayObject as! [[String:AnyObject]]
                let primaryPic = photo[0]
                let farm = primaryPic["farm"] as! Int
                let server = primaryPic["server"] as! String
                let picId = primaryPic["id"] as! String
                let secret = primaryPic["secret"] as! String

                let urlString = String(format: "https://farm%d.static.flickr.com/%@/%@_%@_b.jpg", farm, server, picId, secret)
                self.albumPrimaryURLs.append(urlString)

                DispatchQueue.main.async {
                    self.collectionView.reloadData()
                    self.loaded = true
                }
            })

            task?.resume()
        }
    }

最佳答案

这是多个异步任务的工作方式(无序),您需要创建一个模型而不是单独的数组然后从数据加载以填充最后一个属性

class Item {
  let id,title:String
  var url:String?
  init(id:String,title:String){
   self.id = id
   self.title = title 
  }
  func loadUrl(completion:@escaping () -> () ) {
     // here load and set the url
  }
}

var items = [Item]() // declare main array 

 let albumId = set["id"] as! String
 let albumTitle = set["title"] as! String 
 let item = Item(id:albumId,title:albumTitle)
 self.items.append(item) 

最后加载集合

let g = DispatchGroup()
items.forEach {
   g.enter()
   $0.loadUrl {
      g.leave()
   }
} 
g.notify(queue:.main) {
  self.collectionView.reloadData()
  self.loaded = true
}

关于ios - 数据乱序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56588198/

相关文章:

ios - 在 View 期间更改后重新排列 autoLayout

html - 将页面加载设置为黑色而不是白色背景?

ios - 将区号与电话号码分开 - iOS

ios - 在单个 View Controller iOS 中切换多个 View Controller

ios - UIPageViewController如何访问不可见页面

javascript - 是否可以在 javascript/jquery 中创建一个空的多维数组?

javascript - OAuth 请求 token 错误 :401 in flickr

ios - 直接返回bool语句VS使用if返回bool

ios - swift3 中的表格 View 单元格

swift - 两次调用 Swift 的 readline 到同一个变量会忽略第二次调用