показать данные в виде таблицы из основных данных - PullRequest
0 голосов
/ 20 июня 2019

Я новичок в Swift

Мое приложение для поиска в Flickr API и получения изображений.Я сохраняю из API и показываю это в виде таблицы.когда я запускаю свое приложение в первый раз и ищу, например, «оранжевый», он показывает мой результат поиска, что хорошо, когда я пытаюсь найти снова, например, «яйцо», он ничего не показывает.потому что я должен удалить данные в основных данных и поставить новый поиск по ним, но это не работает, но когда я закрываю приложение и запускаю его снова, это показывает, что данные, которые не отображаются "яйцо"

Я использую MVP, что я могу сделать, чтобы решить эту проблему

Вот первый поиск "оранжевый" Первый поиск

и это второй поиск "яйцо" второй поиск

и после закрытия приложения и его повторного запуска отображается поиск "egg" снова запустите приложение

здесьмой докладчик, который включает метод выборки

//MARK: - Photos delegate
protocol PhotoDataDelegate {
    func updateUI(data: [Photo])
    func noData(bool: Bool)
    func internetConnection(bool: Bool)
}


//MARK: - Photo Presenter Class

class PhotoPresenter{

    var flickrPhotoCoreData = [Photo]()
    var delegate : PhotoDataDelegate!


    //MARK: - Photos featch function
    func fetchPhotoData(searchText:String, handler: @escaping (_ status: Bool) -> ()){
        Alamofire.request(photoURL(apiKey: apiKey, textTosearchFor: searchText, page: 1, numberOfPhotos: 100)).responseJSON { (response) in
            if response.result.isSuccess {
                var data = Data()
                data = response.data!
                let decoder = JSONDecoder()
                let flickrPhotos = try? decoder.decode(FlickrResult.self, from: data)

                PresistenceService.deleteAllData("Photo")

                if flickrPhotos?.photos?.photo.isEmpty == false{
                for item in 0...(flickrPhotos?.photos!.photo.count)! - 1 {
                    let photoURL = "https://farm\((flickrPhotos?.photos?.photo[item].farm)!).staticflickr.com/\((flickrPhotos?.photos?.photo[item].server)!)/\((flickrPhotos?.photos?.photo[item].id)!)_\((flickrPhotos?.photos?.photo[item].secret)!)_m.jpg"
                    let photoID = flickrPhotos?.photos?.photo[item].id
                    let title = flickrPhotos?.photos?.photo[item].title

                    let flickrPhoto = Photo(context: PresistenceService.context)
                    flickrPhoto.id = photoID
                    flickrPhoto.title = title
                    flickrPhoto.imageURL = photoURL
                    flickrPhoto.url = URL(string: flickrPhoto.imageURL!)
                    PresistenceService.saveContext()
                    self.flickrPhotoCoreData.append(flickrPhoto)
                    //self.delegate.updateUI(data: self.flickrPhotoCoreData)
                    //print(self.flickrPhotoCoreData[item].id)
                    //print(self.flickrPhotoCoreData[item].imageURL)
                }
                } else {
                    self.delegate.noData(bool: true)
                    print("nil")
                }
                self.delegate.updateUI(data: self.flickrPhotoCoreData)
                handler(true)

            } else {
                self.delegate.internetConnection(bool: true)
                print("Can not get the data")
            }
        }
    }


}

и это мой tableViewController

import UIKit
import Kingfisher
import CoreData
class PhotoViewController: UITableViewController, UISearchBarDelegate, PhotoDataDelegate {



    @IBOutlet weak var searchBar: UISearchBar!

    var photoPresenter : PhotoPresenter!
    var dataArray = [Photo]()

    override func viewDidLoad() {
        super.viewDidLoad()
        photoPresenter = PhotoPresenter()
        photoPresenter.delegate = self


        let fetchRequest: NSFetchRequest<Photo> = Photo.fetchRequest()
        do {
            let photo = try PresistenceService.context.fetch(fetchRequest)
            dataArray = photo
            tableView.reloadData()
        } catch {}
    }


    //MARK: - Photos search bar
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        let keyword = searchBar.text
        if keyword?.isEmpty == false {
        photoPresenter.fetchPhotoData(searchText: keyword!, handler: {(finished) in
            if finished {
                self.tableView.reloadData()
                print("well done")
            }
        })
        } else {
            let alert = UIAlertController(title: "Enter text", message: "Enter text to search for", preferredStyle: .alert)
            let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
            alert.addAction(action)
            present(alert, animated: true, completion: nil)
        }
        self.view.endEditing(true)
    }


    //MARK: - Photos delegate functions
    func updateUI(data: [Photo]){
        dataArray = data
        tableView.reloadData()
    }

    func noData(bool: Bool) {
        if bool{
            let alert = UIAlertController(title: "No Photos", message: "No photos to show", preferredStyle: .alert)
            let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
            alert.addAction(action)
            present(alert, animated: true, completion: nil)
        }
    }

    func internetConnection(bool: Bool) {
        if bool{
            let alert = UIAlertController(title: "Ooops!", message: "There is no internet connection\nTry Again", preferredStyle: .alert)
            let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
            alert.addAction(action)
            present(alert, animated: true, completion: nil)
        }
    }



    //MARK: - Photos TableView Data
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "flickrPhotoCell", for: indexPath) as! PhotoTableViewCell

        cell.flickrPhoto.kf.indicatorType = .activity
        cell.flickrPhoto.kf.setImage(with: dataArray[indexPath.row].url)
        cell.titleOfPhotoLabel.text = dataArray[indexPath.row].title
        return cell
    }

}

и это основной класс данных


class PresistenceService{


    private init() {}

    static var context: NSManagedObjectContext{
        return persistentContainer.viewContext
    }



    static var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Flickr")
        container.loadPersistentStores(completionHandler: {
            (storeDescription, error) in
            print(storeDescription)
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    static func saveContext() {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let error = error as NSError
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        }
    }


    static func deleteAllData(_ entity: String){
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Photo")
        fetchRequest.returnsObjectsAsFaults = false

        do{
            let results = try persistentContainer.viewContext.fetch(fetchRequest)
            for object in results {
                guard let objectData = object as? NSManagedObject else {continue}
                persistentContainer.viewContext.delete(objectData)
            }
        } catch let error {
            print("Delete all data in \(Photo.self) error:", error)
        }


    }

}

...