Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // ViewController.swift
- // TinkoffChat
- //
- // Created by Никита Бабенко on 23.09.2018.
- // Copyright © 2018 Tinkoff Fintech. All rights reserved.
- //
- import UIKit
- class GCDDataManager{
- var data: String
- var queue: DispatchQueue
- init(_ queueForFiles: DispatchQueue, _ dataForFile: String) {
- queue = queueForFiles
- data = dataForFile
- }
- let file = "data.json"
- func writeData() -> Bool{
- var success: Bool
- success = false
- queue.sync(flags: .barrier) {
- if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
- let fileUrl = dir.appendingPathComponent(file)
- do {
- try self.data.write(to: fileUrl, atomically: false, encoding: .utf8)
- success = true
- } catch {
- print("Couldn't read the file")
- }
- }
- }
- return success
- }
- func readData() -> String? {
- var success: Bool = false
- var data: String = ""
- queue.sync(flags: .barrier) {
- if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
- let fileUrl = dir.appendingPathComponent(file)
- do {
- data = try String(contentsOf: fileUrl, encoding: .utf8)
- success = true
- } catch {
- print("Couldn't read the file")
- }
- }
- }
- if success {
- return data
- } else { return nil }
- }
- }
- class OperationDataManager {
- var data: String
- var queue: OperationQueue
- weak var operationSave: SaveOperation?
- init(_ dataForFile: String, _ queueForFiles: OperationQueue) {
- data = dataForFile
- queue = queueForFiles
- }
- func writeData() -> Bool {
- var success: Bool = true
- let operation = SaveOperation(data)
- operation.completionBlock = {
- success = operation.success
- }
- queue.addOperation(operation)
- queue.waitUntilAllOperationsAreFinished()
- return success
- }
- }
- class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
- @IBOutlet weak var aboutUserLabel: UILabel!
- @IBOutlet weak var avatarImageView: UIImageView!
- @IBOutlet weak var changePhotoButton: UIButton!
- @IBOutlet weak var editButton: UIButton!
- @IBAction func editButton(_ sender: UIButton) {
- self.nameLabel.isHidden = true
- self.aboutUserLabel.isHidden = true
- self.editButton.isHidden = true
- self.saveAsGCDButton.isHidden = false
- self.saveAsOperationButton.isHidden = false
- self.saveAsGCDButton.isEnabled = false
- self.saveAsOperationButton.isEnabled = false
- self.aboutField.isHidden = false
- self.aboutLabel.isHidden = false
- self.usernameField.isHidden = false
- self.usernameLabel.isHidden = false
- self.changePhotoButton.isHidden = false
- }
- @IBOutlet weak var nameLabel: UILabel!
- @IBOutlet weak var dismissButton: UIButton!
- @IBOutlet weak var saveAsOperationButton: UIButton!
- @IBAction func saveAsOperationButton(_ sender: UIButton?) {
- self.activityIndicator.startAnimating()
- let string = """
- {\"username\": \("\"" + self.usernameField.text!)\", \"about\": \("\"" + self.aboutField.text!)\"}
- """
- let queue = OperationQueue()
- let dataManager = OperationDataManager(string, queue)
- let success = dataManager.writeData()
- if success {
- self.successAlert()
- }
- else {
- self.errorAlert()
- }
- self.saveAsOperationButton.isEnabled = false
- self.saveAsGCDButton.isEnabled = false
- self.activityIndicator.stopAnimating()
- //returnToProfile()
- }
- @IBAction func saveAsGCDButton(_ sender: UIButton) {
- self.activityIndicator.startAnimating()
- let queue = DispatchQueue(label: "com.app.queue", qos: .userInitiated, attributes: .concurrent)
- let string = """
- {\"username\": \("\"" + self.usernameField.text!)\", \"about\": \("\"" + self.aboutField.text!)\"}
- """
- //let data = [["username": self.usernameField.text!], ["about": self.aboutField.text!]]
- let dataManager = GCDDataManager(queue, string)
- let success = dataManager.writeData()
- if success {
- self.successAlert()
- }
- else {
- self.errorAlert()
- }
- self.saveAsOperationButton.isEnabled = false
- self.saveAsGCDButton.isEnabled = false
- self.activityIndicator.stopAnimating()
- //returnToProfile()
- }
- func errorAlert() {
- let alert = UIAlertController(title: "Error", message: "Didn't save the data", preferredStyle: UIAlertControllerStyle.alert)
- alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
- alert.addAction(UIAlertAction(title: "Try Again", style: .default, handler: {action in
- self.saveAsOperationButton(nil)
- }))
- self.present(alert, animated: true, completion: nil)
- }
- func successAlert() {
- let alert = UIAlertController(title: "Data is saved", message: "", preferredStyle: UIAlertControllerStyle.alert)
- alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
- self.present(alert, animated: true, completion: nil)
- }
- func convertToDictionary(text: String) -> [String: Any]? {
- if let data = text.data(using: .utf8) {
- do {
- return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
- } catch {
- print(error.localizedDescription)
- }
- }
- return nil
- }
- @IBOutlet weak var usernameField: UITextField!
- @IBAction func usernameFieldChanged(_ sender: UITextField) {
- self.saveAsGCDButton.isEnabled = true
- self.saveAsOperationButton.isEnabled = true
- }
- @IBOutlet weak var saveAsGCDButton: UIButton!
- @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
- @IBOutlet weak var aboutField: UITextView!
- @IBOutlet weak var aboutLabel: UILabel!
- @IBOutlet weak var usernameLabel: UILabel!
- var imagePicker = UIImagePickerController()
- @IBAction func changePhotoButton(_ sender: Any) {
- self.showActionSheet()
- }
- @IBAction func dismissButton(_ sender: UIButton) {
- dismiss(animated: true, completion: nil)
- }
- func returnToProfile() {
- self.activityIndicator.stopAnimating()
- self.nameLabel.isHidden = false
- self.aboutUserLabel.isHidden = false
- self.editButton.isHidden = false
- self.saveAsGCDButton.isHidden = true
- self.saveAsOperationButton.isHidden = true
- self.aboutField.isHidden = true
- self.aboutLabel.isHidden = true
- self.usernameField.isHidden = true
- self.usernameLabel.isHidden = true
- self.changePhotoButton.isHidden = true
- self.saveAsGCDButton.isEnabled = true
- self.saveAsOperationButton.isEnabled = true
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- aboutField.delegate = self
- let crossImage: UIImage = UIImage(named: "cross")!
- self.dismissButton.setImage(crossImage , for: .normal)
- let changePhotoImage: UIImage = UIImage(named: "slr-camera-2-xxl")!
- self.changePhotoButton.contentMode = .scaleAspectFit
- self.changePhotoButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)
- self.changePhotoButton.setImage(changePhotoImage , for: .normal)
- self.changePhotoButton.clipsToBounds = true
- self.changePhotoButton.isHidden = true
- let defaultAvatarImage: UIImage = UIImage(named: "placeholder-user")!
- self.avatarImageView.image = defaultAvatarImage
- self.avatarImageView.layer.masksToBounds = true
- self.avatarImageView.clipsToBounds = true
- self.avatarImageView.layer.cornerRadius = changePhotoButton.bounds.size.width / 2.0
- self.changePhotoButton.layer.masksToBounds = true
- self.changePhotoButton.layer.cornerRadius = changePhotoButton.bounds.size.width / 2.0
- self.editButton.layer.cornerRadius = 10
- self.editButton.layer.borderWidth = 1
- self.nameLabel.font = UIFont.boldSystemFont(ofSize: 30.0)
- self.aboutLabel.isHidden = true
- self.usernameField.isHidden = true
- self.usernameLabel.isHidden = true
- self.activityIndicator.hidesWhenStopped = true
- self.saveAsOperationButton.isHidden = true
- self.saveAsOperationButton.layer.cornerRadius = 10
- self.saveAsOperationButton.layer.borderWidth = 1
- self.saveAsGCDButton.isHidden = true
- self.saveAsGCDButton.layer.cornerRadius = 10
- self.saveAsGCDButton.layer.borderWidth = 1
- self.aboutField.isHidden = true
- self.aboutField.layer.borderWidth = 1
- let queue = DispatchQueue(label: "com.app.queue", attributes: .concurrent)
- let dataManager = GCDDataManager(queue, "")
- let string: String? = dataManager.readData()
- let data = string?.data(using: .utf8)!
- do {
- let dictionary = try JSONSerialization.jsonObject(with: data!, options : .allowFragments) as? [String : String]
- self.nameLabel.text = dictionary?["username"]
- self.aboutUserLabel.text = dictionary?["about"]
- } catch let error as NSError {
- self.nameLabel.text = "No name yet"
- self.aboutUserLabel.text = "No info yet"
- print(error)
- }
- self.aboutField.text = self.aboutUserLabel.text
- self.usernameField.text = self.nameLabel.text
- }
- func chooseFromGallery()
- {
- if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum){
- //print("Button capture")
- imagePicker.sourceType = .photoLibrary
- self.present(imagePicker, animated: true, completion: nil)
- }
- }
- func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
- let image = info[UIImagePickerControllerOriginalImage] as! UIImage
- self.avatarImageView.image = image
- self.dismiss(animated: true, completion: nil)
- }
- func showActionSheet() {
- imagePicker.delegate = self
- imagePicker.allowsEditing = false
- print("Choose your profile pic")
- let actionSheet = UIAlertController(title: nil, message: "Choose your profile picture", preferredStyle: .actionSheet)
- let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
- let choosePhoto = UIAlertAction(title: "Choose from galerry", style: .default) { action in
- self.imagePicker.sourceType = .photoLibrary
- self.present(self.imagePicker, animated: true, completion: nil)
- //self.chooseFromGallery()
- }
- let makePhoto = UIAlertAction(title: "Make a photo", style: .default) { action in
- self.imagePicker.sourceType = .camera
- self.present(self.imagePicker, animated: true, completion: nil)
- }
- actionSheet.addAction(choosePhoto)
- if UIImagePickerController.isSourceTypeAvailable(.camera) {
- actionSheet.addAction(makePhoto)
- }
- else {
- print("Camera is not available")
- }
- actionSheet.addAction(cancel)
- present(actionSheet, animated: true, completion: nil)
- }
- /*
- required init?(coder aDecoder: NSCoder) {
- super.init(coder: aDecoder)
- //во время вызова init() все объекты на view находятся в состоянии nil, именно поэтому ошибка
- //при попытке получения frame
- }*/
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- override func viewWillAppear(_ animated: Bool) {
- //print("Method: \(#function)")
- }
- override func viewWillDisappear(_ animated: Bool) {
- //print("Method: \(#function)")
- }
- override func viewDidAppear(_ animated: Bool) {
- print("viewDidAppear()")
- //Frame во время вызова метода viewDidAppear() отличается от frame'а во время вызова viewDidLoad() потому, что в качестве основного девайса выбран IPhone SE,
- //а приложение запущено в симуляторе IPhone 8 Plus или IPhone X, у которых отличное от SE разрешение. Именно поэтому при viewDidLoad() фрейм заранее
- //определен под основное устройство, а уже при вызове viewDidAppear() фрейм изменён под девайс, запущенный в симуляторе.
- //print("Method: \(#function)")
- }
- override func viewDidDisappear(_ animated: Bool) {
- //print("Method: \(#function)")
- }
- override func viewWillLayoutSubviews() {
- //print("Method: \(#function)")
- }
- override func viewDidLayoutSubviews() {
- //print("Method: \(#function)")
- }
- }
- extension ViewController: UITextViewDelegate {
- func textViewDidChange(_ textView: UITextView) {
- self.saveAsGCDButton.isEnabled = true
- self.saveAsOperationButton.isEnabled = true
- }
- }
- extension String {
- func toJSON() -> Any? {
- guard let data = self.data(using: .utf8, allowLossyConversion: false) else { return nil }
- return try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement