Archived
1
This repository has been archived on 2020-06-04. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
tagtunes/TagTunes/LookupOperation.swift
Kim Wittenburg 0a485ff42a Stuff…
2019-02-01 22:59:01 +01:00

73 lines
2.4 KiB
Swift
Executable File

//
// LookupOperation.swift
// TagTunes
//
// Created by Kim Wittenburg on 08.04.16.
// Copyright © 2016 Kim Wittenburg. All rights reserved.
//
import SearchAPI
import AppKitPlus
class LookupOperation: Operation {
/// The `NSURLSession` used to perform lookup tasks.
private let urlSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: nil, delegateQueue: NSOperationQueue.mainQueue())
let tracks: [TagTunesTrack]
private var lookupTask: NSURLSessionTask!
private var lookupData: NSData?
private var lookupError: ErrorType?
init<S: SequenceType where S.Generator.Element == TagTunesTrack>(tracks: S) {
self.tracks = Array(tracks)
var request = SearchAPIRequest(lookupRequestWithIDs: tracks.flatMap { $0.id })
request.entity = .Album
request.country = Preferences.sharedPreferences.iTunesStore
if Preferences.sharedPreferences.useEnglishTags {
request.language = .English
}
super.init()
self.lookupTask = urlSession.dataTaskWithURL(request.URL, completionHandler: downloadFinishedWithData)
addCondition(MutuallyExclusive<LookupOperation>())
}
private func downloadFinishedWithData(data: NSData?, response: NSURLResponse?, error: NSError?) {
lookupData = data
lookupError = error
}
override func willEnqueue() {
let operation = URLSessionTaskOperation(task: lookupTask)
addDependency(operation)
produceOperation(operation)
super.willEnqueue()
}
override func execute() {
// TODO: This must be executed after the url data task finished. Is that the case?
do {
if let data = lookupData {
let result = try SearchAPIResult(data: data)
for track in tracks where track.id != nil {
if let resultTrack = result.entityForID(track.id!) as? Track {
track.lookupState = .Found(resultTrack)
} else {
track.lookupState = .NotFound
}
}
finish()
} else {
throw lookupError!
}
} catch {
for track in tracks {
track.lookupState = .Error(error)
}
finishWithError(error as NSError?)
}
}
}