Skip to content

Instantly share code, notes, and snippets.

@gfelot
Last active March 14, 2016 16:04
Show Gist options
  • Save gfelot/eec47c3f8d0533d59dc7 to your computer and use it in GitHub Desktop.
Save gfelot/eec47c3f8d0533d59dc7 to your computer and use it in GitHub Desktop.
WIMY - Gloss PB
//
// Book.swift
// WIMB
//
// Created by Gil Felot on 10/01/16.
// Copyright © 2016 gfelot. All rights reserved.
//
import Foundation
import UIKit
import Gloss
struct imageLinks: Decodable {
let coverString: String!
init?(json: JSON) {
if let _medium: String = "medium" <~~ json {
coverString = _medium
} else if let _small: String! = "small" <~~ json {
coverString = _small
} else if let _thumbnail: String! = "thumbnail" <~~ json {
coverString = _thumbnail
} else if let _smallThumbnail: String! = "smallThumbnail" <~~ json {
coverString = _smallThumbnail
} else {
coverString = nil
}
}
}
struct Book: Decodable {
let selfLink:String!
let coverURL:imageLinks!
let title:String!
let authors:[String]!
// let ISBN13:String!
let ID:String!
let desc:String!
let publisher:String!
let publishedDate:String!
let pageCount:Int!
let language:String!
let categories:[String]!
let averageRating:Double! //min 1 to max 5
let previewLink:String!
init?(json: JSON) {
guard let data: JSON = "items" <~~ json else {
print("Error no JSON data available")
return nil
}
guard let _selfLink: String = "selfLink" <~~ data else {
return nil
}
selfLink = _selfLink
guard let _coverURL: imageLinks = "imageLinks" <~~ data else {
return nil
}
coverURL = _coverURL
guard let _title: String = "volumeInfo.title" <~~ data else {
return nil
}
title = _title
guard let _authors: [String] = "volumeInfo.authors" <~~ data else {
return nil
}
authors = _authors
// guard let _ISNB13: String = "volumeInfo.industryIdentifiers" <~~ data else {
// return nil
// }
// ISBN13 = _ISNB13
guard let _id: String = "id" <~~ data else {
return nil
}
ID = _id
guard let _desc: String = "volumeInfo.description" <~~ data else {
return nil
}
desc = _desc
guard let _publisher: String = "volumeInfo.publisher" <~~ data else {
return nil
}
publisher = _publisher
guard let _publishedDate: String = "volumeInfo.publishedDate" <~~ data else {
return nil
}
publishedDate = _publishedDate
guard let _pageCount: Int = "volumeInfo.pageCount" <~~ data else {
return nil
}
pageCount = _pageCount
guard let _language: String = "volumeInfo.language" <~~ data else {
return nil
}
language = _language
guard let _categories: [String] = "volumeInfo.categories" <~~ data else {
return nil
}
categories = _categories
guard let _averageRating: Double = "volumeInfo.averageRating" <~~ data else {
return nil
}
averageRating = _averageRating
guard let _previewLink: String = "volumeInfo.previewLink" <~~ data else {
return nil
}
previewLink = _previewLink
}
}
//
// BookViewController.swift
// WIMB
//
// Created by Gil Felot on 09/01/16.
// Copyright © 2016 gfelot. All rights reserved.
//
import UIKit
import AVFoundation
import Alamofire
protocol ScanBookDelegate{
func didScanBook(scannedBook: Book)
}
class ScanBookViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var book:Book!
var delegate: ScanBookDelegate?
var captureSession: AVCaptureSession!
var previewLayer: AVCaptureVideoPreviewLayer!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blackColor()
captureSession = AVCaptureSession()
let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let videoInput: AVCaptureDeviceInput
do {
videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
} catch {
return
}
guard captureSession.canAddInput(videoInput) else {
alertPopUp("Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.")
captureSession = nil
return
}
captureSession.addInput(videoInput)
let metadataOutput = AVCaptureMetadataOutput()
guard captureSession.canAddOutput(metadataOutput) else {
alertPopUp("Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.")
captureSession = nil
return
}
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code]
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.frame = view.layer.bounds
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
view.layer.addSublayer(previewLayer)
captureSession.startRunning()
}
func alertPopUp(title:String, message:String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in
self.dismissViewControllerAnimated(true, completion: nil)
}))
self.presentViewController(alert, animated: true, completion: nil)
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if (captureSession?.running == false) {
captureSession.startRunning()
}
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
if (captureSession?.running == true) {
captureSession.stopRunning()
}
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
captureSession.stopRunning()
if let metadataObject = metadataObjects.first {
let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
foundCode(readableObject.stringValue)
}
dismissViewControllerAnimated(true, completion: nil)
}
func foundCode(code: String) {
let baseURL = "https://www.googleapis.com/books/v1/volumes?q=isbn="
let APIKey = "&key=AIzaSyAFZQ2C65U-wkrX64UK48Q5WbGWXFZ-fKY"
let options = "&maxResults=1"
let myRequest = baseURL + "\(code)" + options + APIKey
// let requestTest = "https://www.googleapis.com/books/v1/volumes?q=isbn=2226319298&maxResults=1&key=AIzaSyCYXCU5syIlrZ9YyLMOrj-b1x6qylR7aQ4"
Alamofire.request(.GET, myRequest).responseJSON() {
(data) in
print("My JSON")
print(data)
self.book(data)
// let bookData = BookFromJSON(json: data)
// self.book.fillBook(bookData)
}
print("URL : \(myRequest)")
self.delegate?.didScanBook(book) //Call the delegate method
self.navigationController?.popViewControllerAnimated(true)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "infoFinded" {
let bookVC: BookViewController = segue.destinationViewController as! BookViewController
bookVC.book = book
}
}
override func prefersStatusBarHidden() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return .Portrait
}
}
@remirobert
Copy link

🐒

Remplace la déclaration de la variable ?

var book:Book?

TIP : Ensuite pour la requête 🐚
Test la valeur d'erreur, et laisse Alamofire déterminer les erreur en fonction du code avec validate:
C'est avec Result

Alamofire.request(.GET, myRequest).validate().responseJSON(completionHandler: { (response: Response<AnyObject, NSError>) -> Void in
            switch response.result {
            case .Success(let value):
             if let json = value as? [String: AnyObject] {
               //Parse icic
             }
            case .Failure(let err):
                //Erreur
            }
        })

📟 📦 Parser ton objet:

self.book = Book(json: json)
//check si ton book et pas nil => bind tes datas

@gfelot
Copy link
Author

gfelot commented Mar 14, 2016

func foundCode(code: String) {
        let baseURL = "https://www.googleapis.com/books/v1/volumes?q=isbn="
        let APIKey = "&key=AIzaSyAFZQ2C65U-wkrX64UK48Q5WbGWXFZ-fKY"
        let options = "&maxResults=1"
        let myRequest = baseURL + "\(code)" + options + APIKey
//        let requestTest = "https://www.googleapis.com/books/v1/volumes?q=isbn=2226319298&maxResults=1&key=AIzaSyCYXCU5syIlrZ9YyLMOrj-b1x6qylR7aQ4"
        Alamofire.request(.GET, myRequest).validate().responseJSON(completionHandler: { (response: Response<AnyObject, NSError>) -> Void in
            switch response.result {
            case .Success(let value):
                if let json = value as? [String: AnyObject] {
                    //Parse ici
                    print("JSON: \(json)")
                    self.book = Book(json: json)
                    guard let _book = self.book else {

                        print("Error : book = nil")
                    }

                    self.delegate?.didScanBook(self.book!) //Call the delegate method
                    self.navigationController?.popViewControllerAnimated(true)
                }
            case .Failure(let err):
                print("Error: \(err)")

            }
        })


    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment