Save GIFs Locally
This commit is contained in:
@@ -22,8 +22,6 @@ class AddGIFViewController: UIViewController {
|
||||
return textField
|
||||
}()
|
||||
|
||||
|
||||
|
||||
private let previewGIFPlayer: GIFPlayerView = {
|
||||
let player = GIFPlayerView()
|
||||
player.clipsToBounds = true
|
||||
@@ -56,8 +54,9 @@ class AddGIFViewController: UIViewController {
|
||||
return button
|
||||
}()
|
||||
|
||||
private var currentTask: URLSessionDataTask?
|
||||
var onSaveGIF: ((GIF) -> Void)?
|
||||
private var currentTask: Any?
|
||||
private var downloadedGIFData: Data?
|
||||
var onSaveGIF: ((String, Data) -> Void)?
|
||||
var onCancel: (() -> Void)?
|
||||
|
||||
override func viewDidLoad() {
|
||||
@@ -91,7 +90,7 @@ class AddGIFViewController: UIViewController {
|
||||
urlTextField.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 16),
|
||||
urlTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
|
||||
urlTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
|
||||
|
||||
|
||||
previewGIFPlayer.topAnchor.constraint(equalTo: urlTextField.bottomAnchor, constant: 16),
|
||||
previewGIFPlayer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
|
||||
previewGIFPlayer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
|
||||
@@ -113,12 +112,12 @@ class AddGIFViewController: UIViewController {
|
||||
}
|
||||
|
||||
private func setupActions() {
|
||||
urlTextField.delegate = self
|
||||
|
||||
urlTextField.addTarget(self, action: #selector(urlTextDidChange), for: .editingChanged)
|
||||
|
||||
saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside)
|
||||
cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside)
|
||||
urlTextField.delegate = self
|
||||
|
||||
urlTextField.addTarget(self, action: #selector(urlTextDidChange), for: .editingChanged)
|
||||
|
||||
saveButton.addTarget(self, action: #selector(saveButtonTapped), for: .touchUpInside)
|
||||
cancelButton.addTarget(self, action: #selector(cancelButtonTapped), for: .touchUpInside)
|
||||
}
|
||||
|
||||
@objc private func urlTextDidChange() {
|
||||
@@ -132,10 +131,13 @@ class AddGIFViewController: UIViewController {
|
||||
}
|
||||
|
||||
private func loadGIFPreview(from urlString: String) {
|
||||
// Cancel any existing task
|
||||
currentTask?.cancel()
|
||||
// Cancel any existing task if needed
|
||||
if let task = currentTask as? URLSessionTask {
|
||||
task.cancel()
|
||||
}
|
||||
currentTask = nil
|
||||
|
||||
guard let url = URL(string: urlString) else {
|
||||
guard URL(string: urlString) != nil else {
|
||||
saveButton.isEnabled = false
|
||||
return
|
||||
}
|
||||
@@ -143,33 +145,34 @@ class AddGIFViewController: UIViewController {
|
||||
loadingIndicator.startAnimating()
|
||||
previewGIFPlayer.stopAnimating()
|
||||
|
||||
currentTask = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
|
||||
DownloadService.shared.downloadGIF(from: urlString) { [weak self] data, error in
|
||||
DispatchQueue.main.async {
|
||||
guard let self = self else { return }
|
||||
|
||||
self.loadingIndicator.stopAnimating()
|
||||
|
||||
if let data = data, error == nil {
|
||||
self.downloadedGIFData = data
|
||||
self.previewGIFPlayer.loadGIF(from: data)
|
||||
self.previewGIFPlayer.startAnimating()
|
||||
self.saveButton.isEnabled = true
|
||||
} else {
|
||||
self.downloadedGIFData = nil
|
||||
self.previewGIFPlayer.stopAnimating()
|
||||
self.saveButton.isEnabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
currentTask?.resume()
|
||||
}
|
||||
|
||||
@objc private func saveButtonTapped() {
|
||||
guard let urlString = urlTextField.text, !urlString.isEmpty else { return }
|
||||
|
||||
let gif = GIF(urlString: urlString)
|
||||
|
||||
onSaveGIF?(gif)
|
||||
dismiss(animated: true)
|
||||
guard let urlString = urlTextField.text,
|
||||
!urlString.isEmpty,
|
||||
let gifData = downloadedGIFData
|
||||
else { return }
|
||||
|
||||
onSaveGIF?(urlString, gifData)
|
||||
dismiss(animated: true)
|
||||
}
|
||||
|
||||
@objc private func cancelButtonTapped() {
|
||||
@@ -179,8 +182,8 @@ class AddGIFViewController: UIViewController {
|
||||
}
|
||||
|
||||
extension AddGIFViewController: UITextFieldDelegate {
|
||||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||
textField.resignFirstResponder()
|
||||
return true
|
||||
}
|
||||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||
textField.resignFirstResponder()
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,9 +99,12 @@ class GIFCollectionViewController: UIViewController {
|
||||
|
||||
@objc private func addButtonTapped() {
|
||||
let addGIFVC = AddGIFViewController()
|
||||
addGIFVC.onSaveGIF = { [weak self] gif in
|
||||
GIFStorageService.shared.saveGIF(gif)
|
||||
self?.loadGIFs()
|
||||
addGIFVC.onSaveGIF = { [weak self] urlString, gifData in
|
||||
GIFStorageService.shared.saveGIF(data: gifData, fromURL: urlString) { _ in
|
||||
DispatchQueue.main.async {
|
||||
self?.loadGIFs()
|
||||
}
|
||||
}
|
||||
}
|
||||
addGIFVC.onCancel = { [weak self] in
|
||||
self?.dismiss(animated: true)
|
||||
@@ -124,7 +127,7 @@ extension GIFCollectionViewController: UICollectionViewDelegate, UICollectionVie
|
||||
}
|
||||
|
||||
let gif = gifs[indexPath.item]
|
||||
cell.configure(with: gif.urlString)
|
||||
cell.configure(with: gif)
|
||||
|
||||
return cell
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user