Делаю приложение похожее на Instagram. И мне надо загрузить посты в CollectionView.
Есть класс:
class Post {
var postID: String?
var postLabel: String?
var postFullText: String?
var postDate: NSDate?
var postImage: String?
var postAdmin: Company?
var postLocation: LocationClass?
var postAdress: String?
var postStartTime: NSDate?
var postEndTime: NSDate?
var postLikeCount: Int?
var postIsActive: Bool?
init(postImage: String) {
self.postImage = postImage
}
public func downloadPosts(size: Int, from: Int, completion: @escaping ([Post]) -> ()) {
var imagesArray = [Post]()
let user = ""
let password = ""
let url = baseSearchURL + "sales/_search?size=\(size)&from=\(from)"
var headers: HTTPHeaders = [:]
if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {
headers[authorizationHeader.key] = authorizationHeader.value
}
DispatchQueue.global(qos: .userInteractive).async {
Alamofire.request(url, headers: headers)
.responseJSON { response in
if response.error == nil {
let json = JSON(data: response.data!)
if let arrJSON = json["hits"].dictionary {
if let hits = arrJSON["hits"]?.array {
for index in 0...hits.count - 1 {
let aObject = hits[index]
let img = String(describing: aObject["_source"]["img"])
childReference.child("images").child(img).child("img").observe(.childAdded, with: { (snapshot) in
guard let values = snapshot.value as? [String : AnyObject] else { return }
if let images = values["original"] as? String {
let img = Post(postImage: images)
imagesArray.append(img)
print("This is imageArray: \(imagesArray)")
completion(imagesArray)
}
})
}
}
}
}
}
}
}
}
Правильно ли я делаю?
Тут скачиваются посты, и передаются в замыкание.
import UIKit
import Alamofire
import SwiftyJSON
import FirebaseDatabase
import Kingfisher
class SearchCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, UISearchBarDelegate, UIPopoverPresentationControllerDelegate {
//MARK: - Variables
let reuseIdentifier = "Cell"
let post: Post? = nil
var posts = [Post]()
//MARK: - View Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView!.register(SearchCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
self.view.addSubview(collectionView!)
getPosts(size: 10, from: 0)
}
//MARK: - Another functions
func getPosts(size: Int, from: Int) {
post?.downloadPosts(size: size, from: from) { images in
self.posts.append(contentsOf: images)
self.collectionView?.reloadData()
}
}
//MARK: - UICollection View
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return posts.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let section = indexPath.section
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! SearchCollectionViewCell
let url = URL(string: posts[indexPath.row].postImage!)
let resource = ImageResource(downloadURL: url!, cacheKey: posts[indexPath.row].postImage!)
cell.imageView.kf.setImage(with: resource)
return cell
}
}
Но теперь я не могу понять как использовать его в CollectionView
Как правильно сделать? Спасибо.