从 api 检索大量数据并在 UICollectionView Swift 中使用它

Posted

技术标签:

【中文标题】从 api 检索大量数据并在 UICollectionView Swift 中使用它【英文标题】:retrieving a lot of data from api and use it inside UICollectionView Swift 【发布时间】:2020-02-03 19:28:36 【问题描述】:

您好,我正在开发一个检索电影数据的应用程序,但我有一些问题,这是我的代码:

let categories = [MovieCategory(generID: "28", categoryTitle: "Action")
    ,MovieCategory(generID: "16", categoryTitle: "Animation")
    ,MovieCategory(generID: "35", categoryTitle: "Comedy"),
     MovieCategory(generID: "18", categoryTitle: "Drama"),
     MovieCategory(generID: "27", categoryTitle: "Horror"),
     MovieCategory(generID: "10752", categoryTitle: "War")]

func parseJson( category: MovieCategory)


    self.collectionView.reloadData()
    var currentCategory = category
    let parameters = ["api_key":"8460d476d21be7e26a99234d8ca8de51","sort_by":"false","include_video":"false","with_genres":category.generID]

    Alamofire.request(url, method: .get, parameters: parameters).responseJSON  (response) in
        if response.result.isSuccess
            let movieJSON = JSON(response.result.value!)

for i in 0..<20
        let title = movieJSON["results"][i]["title"].stringValue
        let posterPath = movieJSON["results"][i]["poster_path"].stringValue

        let overview = movieJSON["results"][i]["overview"].stringValue
        let dateReleased = movieJSON["results"][i]["release_date"].stringValue
        let voteAverage = movieJSON["results"][i]["vote_average"].stringValue
        if let safeImage = self.createImage(posterPath: posterPath)
        
        let movieDetails = MovieDetails(movieTitle: title, poster: safeImage, voteAverage: voteAverage, overview: overview, releaseDate: dateReleased)
        currentCategory.categoryMovies.append(movieDetails)
        self.actionMovies.append(UIImage(named: "gul")!)
        self.collectionView.reloadData()
        

            

                                   

        

我使用两个结构作为数据源,它们是:

struct MovieCategory 
let generID:String
let categoryTitle:String
var categoryMovies:[MovieDetails] = []

和:

struct MovieDetails
let movieTitle:String
let poster:UIImage
let voteAverage:String
let overview:String
let releaseDate:String

但是当我想在 category.categoryMovies 中获取数据时,结果是空的,我如何在 parseJson 函数中将数据附加到它我不知道为什么当调用 numberOfItemsInSection 方法时它是空的,它返回类别 [section]。 categoryMovies.count 并且它没有调用 cellForItemAtIndexpath 让我认为它是空的方法。 如果您知道解决方案,我非常感谢您的帮助。

谢谢

【问题讨论】:

你能显示你的资源获取代码的sn-ps吗? 您可能需要换一种方式来思考这个问题。您无法知道下载内容需要多长时间,但您确实知道下载内容的时间。您可能会发现使用 SDWebImage 或 Kingfisher 之类的工具下载图像更容易。他们有方便的方法,可以将占位符图像放入图像视图并在下载完成时替换它。 如果您不想使用外部代码,那么您需要自己实现类似的东西;检查您的图像缓存以查看图像是否可用。如果没有,开始下载并传递一个闭包,当下载完成时更新图像视图 URLSessionDownloadDelegate 在这种情况下将是你最好的朋友。发生的情况很可能是您的视图在下载数据之前正在加载。如果您使用下载委托,您可以跟踪下载进度并在下载完成时触发视图更新。 【参考方案1】:

我发现解决方案只是将结构定义为类,因为它们通过引用传递值,它解决了我的问题

【讨论】:

以上是关于从 api 检索大量数据并在 UICollectionView Swift 中使用它的主要内容,如果未能解决你的问题,请参考以下文章

在不重载的情况下将 JSON api 连接到 tableView

从 NSDictionary 中检索数据,并在值周围加上引号?

从 firebase 数据库中检索数据并在 Objective-C 中的 UITable 中显示

以正确的方式从实时数据库中检索大量数据

从数据库中检索 MS Word 文档并在本地保存

Swift:从 Firebase 检索数据并在表格视图中显示