Загрузка постов ООП

swift
xcode
ios
swift3

#1

Делаю приложение похожее на 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
Как правильно сделать? Спасибо.


#2
  1. Зачем в названиях полей класса Post слово post? И так понятно что это пост.

  2. Метод downloadPosts не должен находится в классе Post, создайте отдельную модель для API.

  3. Что за 100500 вложенных if let? Используйте что-то типа ObjectMapper.

  4. При парсинге JSON вы инициализируете Post одним изображением - это так и задумано?

  5. Зачем вы создаете метод

    func getPosts(size: Int, from: Int) {
    post?.downloadPosts(size: size, from: from) { images in
    self.posts.append(contentsOf: images)
    self.collectionView?.reloadData()
    }
    }

  6. Вы при реюзе ячейки будете каждый раз по новой загружать изображение?

     let resource = ImageResource(downloadURL: url!, cacheKey: posts[indexPath.row].postImage!)

#3
  1. Исправил
  2. Отдельный класс для загрузки данных?
  3. Посмотрю
  4. Там же массив картинок
  5. Сразу замыкание вызывать? Я думал что буду переиспользовать
  6. Это для кэша, чтобы заново не качать картинки

#4

Да.

Я не знаю структуру вашего JSON-a и какие данные из него вы можете получить.

Оно вообще по другому должно выглядеть.


#5

Подскажите как именно? Спасибо.


#6

Рассмотрим самый примитивный пример:

class RESTful {
    static var shared: RESTful = RESTful()
    
    func downloadPosts(range: CountableClosedRange<Int>, completion: @escaping ([Post]) -> ()) {
        // downloading
    }
}

class ViewController: UIViewController {
    var collectionView: UICollectionView!
    
    var posts: [Post] = [Post]() {
        didSet {
            collectionView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        updatePosts(0...10)
    }
    
    func updatePosts(_ range: CountableClosedRange<Int>) {
        RESTfull.shared.downloadPosts(range: range) { self.posts = $0 }
    }
}

#7

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#8

Я безграмотный)



#9

Хороший пример, только к сожалению те для кого он написан прочитают и пойдут дальше)))