mirror of
https://github.com/kiwix/kiwix-apple.git
synced 2025-09-27 22:10:57 -04:00
Cancel Download OP & other changes
This commit is contained in:
parent
11d442789e
commit
b3ae1c6a02
@ -34,7 +34,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||||||
application.registerUserNotificationSettings(settings)
|
application.registerUserNotificationSettings(settings)
|
||||||
|
|
||||||
// Set background refresh interval
|
// Set background refresh interval
|
||||||
application.setMinimumBackgroundFetchInterval(60 * 60 * 24)
|
application.setMinimumBackgroundFetchInterval(86400)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -150,7 +150,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let notification = UILocalNotification()
|
let notification = UILocalNotification()
|
||||||
notification.alertTitle = "[debug] Library was refreshed"
|
notification.alertTitle = "[DEBUG] Library was refreshed"
|
||||||
notification.alertBody = NSDate().description
|
notification.alertBody = NSDate().description
|
||||||
notification.soundName = UILocalNotificationDefaultSoundName
|
notification.soundName = UILocalNotificationDefaultSoundName
|
||||||
UIApplication.sharedApplication().presentLocalNotificationNow(notification)
|
UIApplication.sharedApplication().presentLocalNotificationNow(notification)
|
||||||
|
@ -12,6 +12,8 @@ import DZNEmptyDataSet
|
|||||||
|
|
||||||
class DownloadTasksController: UITableViewController, NSFetchedResultsControllerDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate {
|
class DownloadTasksController: UITableViewController, NSFetchedResultsControllerDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate {
|
||||||
|
|
||||||
|
var timer: NSTimer?
|
||||||
|
|
||||||
// MARK: - Override
|
// MARK: - Override
|
||||||
|
|
||||||
required init?(coder aDecoder: NSCoder) {
|
required init?(coder aDecoder: NSCoder) {
|
||||||
@ -33,6 +35,29 @@ class DownloadTasksController: UITableViewController, NSFetchedResultsController
|
|||||||
override func viewWillAppear(animated: Bool) {
|
override func viewWillAppear(animated: Bool) {
|
||||||
super.viewWillAppear(animated)
|
super.viewWillAppear(animated)
|
||||||
tabBarController?.navigationItem.rightBarButtonItem = nil
|
tabBarController?.navigationItem.rightBarButtonItem = nil
|
||||||
|
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(DownloadTasksController.refreshProgress), userInfo: nil, repeats: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewWillDisappear(animated: Bool) {
|
||||||
|
super.viewWillDisappear(animated)
|
||||||
|
timer?.invalidate()
|
||||||
|
timer = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
|
||||||
|
guard let identifier = segue.identifier else {return}
|
||||||
|
switch identifier {
|
||||||
|
case "ShowBookDetail":
|
||||||
|
guard let navController = segue.destinationViewController as? UINavigationController,
|
||||||
|
let bookDetailController = navController.topViewController as? BookDetailController,
|
||||||
|
let cell = sender as? UITableViewCell,
|
||||||
|
let indexPath = tableView.indexPathForCell(cell),
|
||||||
|
let downloadTask = fetchedResultController.objectAtIndexPath(indexPath) as? DownloadTask,
|
||||||
|
let book = downloadTask.book else {return}
|
||||||
|
bookDetailController.book = book
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
|
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
|
||||||
@ -43,6 +68,15 @@ class DownloadTasksController: UITableViewController, NSFetchedResultsController
|
|||||||
tableView.scrollIndicatorInsets = inset
|
tableView.scrollIndicatorInsets = inset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Methods
|
||||||
|
|
||||||
|
func refreshProgress() {
|
||||||
|
tableView.visibleCells.forEach { (cell) in
|
||||||
|
guard let indexPath = tableView.indexPathForCell(cell) else {return}
|
||||||
|
configureCell(cell, atIndexPath: indexPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - TableView Data Source
|
// MARK: - TableView Data Source
|
||||||
|
|
||||||
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
|
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
|
||||||
@ -67,19 +101,10 @@ class DownloadTasksController: UITableViewController, NSFetchedResultsController
|
|||||||
|
|
||||||
cell.titleLabel.text = book.title
|
cell.titleLabel.text = book.title
|
||||||
cell.favIcon.image = UIImage(data: book.favIcon ?? NSData())
|
cell.favIcon.image = UIImage(data: book.favIcon ?? NSData())
|
||||||
//
|
|
||||||
// guard let progress = Network.shared.progresses[id] else {return}
|
|
||||||
// cell.progressView.progress = Float(progress.fractionCompleted)
|
|
||||||
|
|
||||||
// switch downloadTask.state {
|
guard let progress = Network.shared.operations[id]?.progress else {return}
|
||||||
// case .Queued, .Downloading:
|
cell.progressView.progress = Float(progress.fractionCompleted)
|
||||||
// cell.accessoryImageView.highlighted = false
|
cell.detailLabel.text = progress.localizedAdditionalDescription.stringByReplacingOccurrencesOfString(" – ", withString: "\n")
|
||||||
// cell.accessoryImageTintColor = UIColor.orangeColor().colorWithAlphaComponent(0.75)
|
|
||||||
// case .Paused, .Error:
|
|
||||||
// cell.accessoryImageView.highlighted = true
|
|
||||||
// cell.accessoryHighlightedImageTintColor = UIColor.greenColor().colorWithAlphaComponent(0.75)
|
|
||||||
// }
|
|
||||||
// cell.subtitleLabel.text = progress.description
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Other Data Source
|
// MARK: Other Data Source
|
||||||
@ -114,27 +139,21 @@ class DownloadTasksController: UITableViewController, NSFetchedResultsController
|
|||||||
// header.textLabel?.font = UIFont.boldSystemFontOfSize(14)
|
// header.textLabel?.font = UIFont.boldSystemFontOfSize(14)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
|
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
|
||||||
// return true
|
return true
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {}
|
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {}
|
||||||
//
|
|
||||||
// override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
|
override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
|
||||||
// let remove = UITableViewRowAction(style: .Destructive, title: LocalizedStrings.remove) { (action, indexPath) -> Void in
|
let remove = UITableViewRowAction(style: .Destructive, title: LocalizedStrings.remove) { (action, indexPath) -> Void in
|
||||||
// guard let downloadTask = self.fetchedResultController.objectAtIndexPath(indexPath) as? DownloadTask else {return}
|
guard let downloadTask = self.fetchedResultController.objectAtIndexPath(indexPath) as? DownloadTask,
|
||||||
// let context = UIApplication.appDelegate.managedObjectContext
|
let bookID = downloadTask.book?.id else {return}
|
||||||
// if let book = downloadTask.book {
|
let operation = CancelBookDownloadOperation(bookID: bookID)
|
||||||
// Network.sharedInstance.cancel(book)
|
GlobalOperationQueue.sharedInstance.addOperation(operation)
|
||||||
// FileManager.removeResumeData(book)
|
}
|
||||||
// }
|
return [remove]
|
||||||
// context.performBlockAndWait({ () -> Void in
|
}
|
||||||
// downloadTask.book?.isLocal = false
|
|
||||||
// context.deleteObject(downloadTask)
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// return [remove]
|
|
||||||
// }
|
|
||||||
|
|
||||||
// MARK: - Fetched Results Controller
|
// MARK: - Fetched Results Controller
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1.7.1386</string>
|
<string>1.7.1423</string>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
@ -469,7 +469,7 @@
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<prototypes>
|
<prototypes>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="Cell" rowHeight="100" id="ekT-ed-PU9" customClass="DownloadBookCell" customModule="Kiwix" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" rowHeight="100" id="ekT-ed-PU9" customClass="DownloadBookCell" customModule="Kiwix" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="92" width="375" height="100"/>
|
<rect key="frame" x="0.0" y="92" width="375" height="100"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ekT-ed-PU9" id="oM4-Hy-Mkf">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ekT-ed-PU9" id="oM4-Hy-Mkf">
|
||||||
@ -515,6 +515,7 @@
|
|||||||
<outlet property="favIcon" destination="Too-68-SzG" id="nfU-AD-1Ji"/>
|
<outlet property="favIcon" destination="Too-68-SzG" id="nfU-AD-1Ji"/>
|
||||||
<outlet property="progressView" destination="g0o-rT-qxm" id="Jaw-Zr-uJY"/>
|
<outlet property="progressView" destination="g0o-rT-qxm" id="Jaw-Zr-uJY"/>
|
||||||
<outlet property="titleLabel" destination="Hji-3G-yaJ" id="mZ2-S6-XEO"/>
|
<outlet property="titleLabel" destination="Hji-3G-yaJ" id="mZ2-S6-XEO"/>
|
||||||
|
<segue destination="5Sz-gR-dgz" kind="showDetail" identifier="ShowBookDetail" id="eUy-Zq-fkw"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
</prototypes>
|
</prototypes>
|
||||||
@ -686,6 +687,6 @@
|
|||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<inferredMetricsTieBreakers>
|
<inferredMetricsTieBreakers>
|
||||||
<segue reference="N3M-rH-rAM"/>
|
<segue reference="eUy-Zq-fkw"/>
|
||||||
</inferredMetricsTieBreakers>
|
</inferredMetricsTieBreakers>
|
||||||
</document>
|
</document>
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1.7.1673</string>
|
<string>1.7.1742</string>
|
||||||
<key>NSExtension</key>
|
<key>NSExtension</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSExtensionMainStoryboard</key>
|
<key>NSExtensionMainStoryboard</key>
|
||||||
|
@ -38,7 +38,6 @@
|
|||||||
971A104A1D022CBE007FC62C /* SearchResultTBVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10471D022CBE007FC62C /* SearchResultTBVC.swift */; };
|
971A104A1D022CBE007FC62C /* SearchResultTBVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10471D022CBE007FC62C /* SearchResultTBVC.swift */; };
|
||||||
971A104B1D022CBE007FC62C /* SearchBooksVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10481D022CBE007FC62C /* SearchBooksVC.swift */; };
|
971A104B1D022CBE007FC62C /* SearchBooksVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10481D022CBE007FC62C /* SearchBooksVC.swift */; };
|
||||||
971A10521D022D9D007FC62C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10511D022D9D007FC62C /* AppDelegate.swift */; };
|
971A10521D022D9D007FC62C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A10511D022D9D007FC62C /* AppDelegate.swift */; };
|
||||||
971A106F1D022E62007FC62C /* DownloadProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971A106D1D022E62007FC62C /* DownloadProgress.swift */; };
|
|
||||||
971A10771D022F05007FC62C /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 971A10791D022F05007FC62C /* Localizable.stringsdict */; };
|
971A10771D022F05007FC62C /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = 971A10791D022F05007FC62C /* Localizable.stringsdict */; };
|
||||||
971A107E1D022F74007FC62C /* DownloaderLearnMore.html in Resources */ = {isa = PBXBuildFile; fileRef = 971A107A1D022F74007FC62C /* DownloaderLearnMore.html */; };
|
971A107E1D022F74007FC62C /* DownloaderLearnMore.html in Resources */ = {isa = PBXBuildFile; fileRef = 971A107A1D022F74007FC62C /* DownloaderLearnMore.html */; };
|
||||||
971A107F1D022F74007FC62C /* ImportBookLearnMore.html in Resources */ = {isa = PBXBuildFile; fileRef = 971A107B1D022F74007FC62C /* ImportBookLearnMore.html */; };
|
971A107F1D022F74007FC62C /* ImportBookLearnMore.html in Resources */ = {isa = PBXBuildFile; fileRef = 971A107B1D022F74007FC62C /* ImportBookLearnMore.html */; };
|
||||||
@ -131,7 +130,7 @@
|
|||||||
97D681421D6F712800E5FA99 /* Language+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D6813E1D6F712800E5FA99 /* Language+CoreDataProperties.swift */; };
|
97D681421D6F712800E5FA99 /* Language+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D6813E1D6F712800E5FA99 /* Language+CoreDataProperties.swift */; };
|
||||||
97D681441D6F713200E5FA99 /* CoreDataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D681431D6F713200E5FA99 /* CoreDataExtension.swift */; };
|
97D681441D6F713200E5FA99 /* CoreDataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D681431D6F713200E5FA99 /* CoreDataExtension.swift */; };
|
||||||
97DB65DA1D4576B600A2CC42 /* BookmarkWidgetCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DB65D91D4576B600A2CC42 /* BookmarkWidgetCell.swift */; };
|
97DB65DA1D4576B600A2CC42 /* BookmarkWidgetCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DB65D91D4576B600A2CC42 /* BookmarkWidgetCell.swift */; };
|
||||||
97DF259C1D6F7613001648A3 /* DownloadBookOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF259B1D6F7612001648A3 /* DownloadBookOperation.swift */; };
|
97DF259C1D6F7613001648A3 /* BookOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF259B1D6F7612001648A3 /* BookOperation.swift */; };
|
||||||
97DF259D1D6F9053001648A3 /* URLSessionDownloadTaskOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D681221D6F70AC00E5FA99 /* URLSessionDownloadTaskOperation.swift */; };
|
97DF259D1D6F9053001648A3 /* URLSessionDownloadTaskOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D681221D6F70AC00E5FA99 /* URLSessionDownloadTaskOperation.swift */; };
|
||||||
97DF25A01D6F996B001648A3 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF259F1D6F996B001648A3 /* Network.swift */; };
|
97DF25A01D6F996B001648A3 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF259F1D6F996B001648A3 /* Network.swift */; };
|
||||||
97E60A021D10423A00EBCB9D /* ShadowViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E60A011D10423A00EBCB9D /* ShadowViews.swift */; };
|
97E60A021D10423A00EBCB9D /* ShadowViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E60A011D10423A00EBCB9D /* ShadowViews.swift */; };
|
||||||
@ -357,7 +356,7 @@
|
|||||||
97D6813E1D6F712800E5FA99 /* Language+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Language+CoreDataProperties.swift"; path = "Classes/Language+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
97D6813E1D6F712800E5FA99 /* Language+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Language+CoreDataProperties.swift"; path = "Classes/Language+CoreDataProperties.swift"; sourceTree = "<group>"; };
|
||||||
97D681431D6F713200E5FA99 /* CoreDataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CoreDataExtension.swift; path = Classes/CoreDataExtension.swift; sourceTree = "<group>"; };
|
97D681431D6F713200E5FA99 /* CoreDataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CoreDataExtension.swift; path = Classes/CoreDataExtension.swift; sourceTree = "<group>"; };
|
||||||
97DB65D91D4576B600A2CC42 /* BookmarkWidgetCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkWidgetCell.swift; sourceTree = "<group>"; };
|
97DB65D91D4576B600A2CC42 /* BookmarkWidgetCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkWidgetCell.swift; sourceTree = "<group>"; };
|
||||||
97DF259B1D6F7612001648A3 /* DownloadBookOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadBookOperation.swift; sourceTree = "<group>"; };
|
97DF259B1D6F7612001648A3 /* BookOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookOperation.swift; sourceTree = "<group>"; };
|
||||||
97DF259F1D6F996B001648A3 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = "<group>"; };
|
97DF259F1D6F996B001648A3 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = "<group>"; };
|
||||||
97E609F01D103DED00EBCB9D /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; };
|
97E609F01D103DED00EBCB9D /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; };
|
||||||
97E60A011D10423A00EBCB9D /* ShadowViews.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowViews.swift; sourceTree = "<group>"; };
|
97E60A011D10423A00EBCB9D /* ShadowViews.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShadowViews.swift; sourceTree = "<group>"; };
|
||||||
@ -969,7 +968,7 @@
|
|||||||
97E5712A1CA0525300FF4F1D /* Operation */ = {
|
97E5712A1CA0525300FF4F1D /* Operation */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
97DF259B1D6F7612001648A3 /* DownloadBookOperation.swift */,
|
97DF259B1D6F7612001648A3 /* BookOperation.swift */,
|
||||||
97D6811C1D6F70AC00E5FA99 /* GlobalOperationQueue.swift */,
|
97D6811C1D6F70AC00E5FA99 /* GlobalOperationQueue.swift */,
|
||||||
97D6811D1D6F70AC00E5FA99 /* RefreshLibraryOperation.swift */,
|
97D6811D1D6F70AC00E5FA99 /* RefreshLibraryOperation.swift */,
|
||||||
97D6811E1D6F70AC00E5FA99 /* ScanLocalBookOperation.swift */,
|
97D6811E1D6F70AC00E5FA99 /* ScanLocalBookOperation.swift */,
|
||||||
@ -1499,7 +1498,6 @@
|
|||||||
97A7017F1D2C59CA00AAE2D8 /* GetStartedController.swift in Sources */,
|
97A7017F1D2C59CA00AAE2D8 /* GetStartedController.swift in Sources */,
|
||||||
97A8AD871D6CF38000584ED1 /* EmptyTableConfigExtension.swift in Sources */,
|
97A8AD871D6CF38000584ED1 /* EmptyTableConfigExtension.swift in Sources */,
|
||||||
97D452BC1D16FF010033666F /* RecentSearchCVC.swift in Sources */,
|
97D452BC1D16FF010033666F /* RecentSearchCVC.swift in Sources */,
|
||||||
971A106F1D022E62007FC62C /* DownloadProgress.swift in Sources */,
|
|
||||||
971A102E1D022AD5007FC62C /* TableViewCells.swift in Sources */,
|
971A102E1D022AD5007FC62C /* TableViewCells.swift in Sources */,
|
||||||
97DF259D1D6F9053001648A3 /* URLSessionDownloadTaskOperation.swift in Sources */,
|
97DF259D1D6F9053001648A3 /* URLSessionDownloadTaskOperation.swift in Sources */,
|
||||||
97E60A021D10423A00EBCB9D /* ShadowViews.swift in Sources */,
|
97E60A021D10423A00EBCB9D /* ShadowViews.swift in Sources */,
|
||||||
@ -1555,7 +1553,7 @@
|
|||||||
97A1FD441D6F728200A80EE2 /* Preference.swift in Sources */,
|
97A1FD441D6F728200A80EE2 /* Preference.swift in Sources */,
|
||||||
97D681311D6F70EC00E5FA99 /* 1.5.xcmappingmodel in Sources */,
|
97D681311D6F70EC00E5FA99 /* 1.5.xcmappingmodel in Sources */,
|
||||||
97D681441D6F713200E5FA99 /* CoreDataExtension.swift in Sources */,
|
97D681441D6F713200E5FA99 /* CoreDataExtension.swift in Sources */,
|
||||||
97DF259C1D6F7613001648A3 /* DownloadBookOperation.swift in Sources */,
|
97DF259C1D6F7613001648A3 /* BookOperation.swift in Sources */,
|
||||||
97A1FD181D6F71CE00A80EE2 /* SearchResult.swift in Sources */,
|
97A1FD181D6F71CE00A80EE2 /* SearchResult.swift in Sources */,
|
||||||
9763275E1D64FE0F0034F120 /* BookDetailController.swift in Sources */,
|
9763275E1D64FE0F0034F120 /* BookDetailController.swift in Sources */,
|
||||||
973DD4281D36E3E4009D45DB /* SettingSingleSwitchTBVC.swift in Sources */,
|
973DD4281D36E3E4009D45DB /* SettingSingleSwitchTBVC.swift in Sources */,
|
||||||
|
@ -9,10 +9,11 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
import Operations
|
import Operations
|
||||||
|
|
||||||
// , NSURLSessionDownloadDelegate, NSURLSessionTaskDelegate
|
// , NSURLSessionTaskDelegate
|
||||||
class Network: NSObject, NSURLSessionDelegate, OperationQueueDelegate {
|
class Network: NSObject, NSURLSessionDelegate, NSURLSessionDownloadDelegate, OperationQueueDelegate {
|
||||||
static let shared = Network()
|
static let shared = Network()
|
||||||
let queue = OperationQueue()
|
let queue = OperationQueue()
|
||||||
|
private(set) var operations = [String: DownloadBookOperation]()
|
||||||
|
|
||||||
private override init() {
|
private override init() {
|
||||||
super.init()
|
super.init()
|
||||||
@ -26,15 +27,34 @@ class Network: NSObject, NSURLSessionDelegate, OperationQueueDelegate {
|
|||||||
return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
|
return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// MARK: - OperationQueueDelegate
|
||||||
|
|
||||||
func operationQueue(queue: OperationQueue, willAddOperation operation: NSOperation) {
|
func operationQueue(queue: OperationQueue, willAddOperation operation: NSOperation) {
|
||||||
print(queue.operationCount)
|
print("DEBUG: Network Queue will add" + (operation.name ?? "Unknown OP"))
|
||||||
|
guard let bookID = operation.name,
|
||||||
|
let operation = operation as? DownloadBookOperation else {return}
|
||||||
|
operations[bookID] = operation
|
||||||
}
|
}
|
||||||
|
|
||||||
func operationQueue(queue: OperationQueue, willFinishOperation operation: NSOperation, withErrors errors: [ErrorType]) {}
|
func operationQueue(queue: OperationQueue, willFinishOperation operation: NSOperation, withErrors errors: [ErrorType]) {}
|
||||||
|
|
||||||
func operationQueue(queue: OperationQueue, didFinishOperation operation: NSOperation, withErrors errors: [ErrorType]) {
|
func operationQueue(queue: OperationQueue, didFinishOperation operation: NSOperation, withErrors errors: [ErrorType]) {
|
||||||
print(queue.operationCount)
|
print("DEBUG: Network Queue did finish" + (operation.name ?? "Unknown OP"))
|
||||||
|
guard let bookID = operation.name else {return}
|
||||||
|
operations[bookID] = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func operationQueue(queue: OperationQueue, willProduceOperation operation: NSOperation) {}
|
func operationQueue(queue: OperationQueue, willProduceOperation operation: NSOperation) {}
|
||||||
|
|
||||||
|
// MARK: - NSURLSessionDownloadDelegate
|
||||||
|
|
||||||
|
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
|
||||||
|
guard let bookID = downloadTask.taskDescription,
|
||||||
|
let operation = operations[bookID] else {return}
|
||||||
|
operation.progress.completedUnitCount = totalBytesWritten
|
||||||
|
}
|
||||||
|
|
||||||
|
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
76
Kiwix/Operations/BookOperation.swift
Normal file
76
Kiwix/Operations/BookOperation.swift
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
//
|
||||||
|
// DownloadBookOperation.swift
|
||||||
|
// Kiwix
|
||||||
|
//
|
||||||
|
// Created by Chris Li on 8/25/16.
|
||||||
|
// Copyright © 2016 Chris. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
import CoreData
|
||||||
|
import Operations
|
||||||
|
|
||||||
|
class DownloadBookOperation: URLSessionDownloadTaskOperation {
|
||||||
|
|
||||||
|
let progress: DownloadProgress
|
||||||
|
|
||||||
|
override init(downloadTask: NSURLSessionDownloadTask) {
|
||||||
|
progress = DownloadProgress(completedUnitCount: downloadTask.countOfBytesReceived, totalUnitCount: downloadTask.countOfBytesExpectedToReceive)
|
||||||
|
super.init(downloadTask: downloadTask)
|
||||||
|
name = downloadTask.taskDescription
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience init?(bookID: String) {
|
||||||
|
let context = NSManagedObjectContext.mainQueueContext
|
||||||
|
guard let book = Book.fetch(bookID, context: context),
|
||||||
|
let url = book.url else { return nil }
|
||||||
|
|
||||||
|
let task = Network.shared.session.downloadTaskWithURL(url)
|
||||||
|
task.taskDescription = bookID
|
||||||
|
self.init(downloadTask: task)
|
||||||
|
|
||||||
|
let downloadTask = DownloadTask.addOrUpdate(book, context: context)
|
||||||
|
downloadTask?.state = .Queued
|
||||||
|
|
||||||
|
progress.completedUnitCount = book.downloadTask?.totalBytesWritten ?? 0
|
||||||
|
progress.totalUnitCount = book.fileSize
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class CancelBookDownloadOperation: Operation {
|
||||||
|
|
||||||
|
let bookID: String
|
||||||
|
|
||||||
|
init(bookID: String) {
|
||||||
|
self.bookID = bookID
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
override func execute() {
|
||||||
|
Network.shared.operations[bookID]?.cancel(produceResumeData: false)
|
||||||
|
|
||||||
|
let context = NSManagedObjectContext.mainQueueContext
|
||||||
|
context.performBlockAndWait {
|
||||||
|
guard let book = Book.fetch(self.bookID, context: context) else {return}
|
||||||
|
if let _ = book.meta4URL {
|
||||||
|
book.isLocal = false
|
||||||
|
} else{
|
||||||
|
context.deleteObject(book)
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let downloadTask = book.downloadTask else {return}
|
||||||
|
context.deleteObject(downloadTask)
|
||||||
|
}
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DownloadProgress: NSProgress {
|
||||||
|
init(completedUnitCount: Int64, totalUnitCount: Int64) {
|
||||||
|
super.init(parent: nil, userInfo: [NSProgressFileOperationKindKey: NSProgressFileOperationKindDownloading])
|
||||||
|
self.kind = NSProgressKindFile
|
||||||
|
self.totalUnitCount = totalUnitCount
|
||||||
|
self.completedUnitCount = completedUnitCount
|
||||||
|
}
|
||||||
|
}
|
@ -1,35 +0,0 @@
|
|||||||
//
|
|
||||||
// DownloadBookOperation.swift
|
|
||||||
// Kiwix
|
|
||||||
//
|
|
||||||
// Created by Chris Li on 8/25/16.
|
|
||||||
// Copyright © 2016 Chris. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import UIKit
|
|
||||||
import CoreData
|
|
||||||
import Operations
|
|
||||||
|
|
||||||
class DownloadBookOperation: URLSessionDownloadTaskOperation {
|
|
||||||
|
|
||||||
convenience init?(bookID: String) {
|
|
||||||
let context = NSManagedObjectContext.mainQueueContext
|
|
||||||
guard let book = Book.fetch(bookID, context: context),
|
|
||||||
let url = book.url else { return nil }
|
|
||||||
|
|
||||||
// book
|
|
||||||
let task = Network.shared.session.downloadTaskWithURL(url)
|
|
||||||
|
|
||||||
let downloadTask = DownloadTask.addOrUpdate(book, context: context)
|
|
||||||
downloadTask?.state = .Queued
|
|
||||||
|
|
||||||
task.taskDescription = bookID
|
|
||||||
self.init(downloadTask: task)
|
|
||||||
}
|
|
||||||
|
|
||||||
override func operationDidFinish(errors: [ErrorType]) {
|
|
||||||
guard let bookID = task.taskDescription else {return}
|
|
||||||
print("Book download op finished")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -16,7 +16,7 @@ class URLSessionDownloadTaskOperation: Operation {
|
|||||||
|
|
||||||
let task: NSURLSessionTask
|
let task: NSURLSessionTask
|
||||||
|
|
||||||
private var produceResumeData = false
|
private(set) var produceResumeData = false
|
||||||
private var removedObserved = false
|
private var removedObserved = false
|
||||||
private let lock = NSLock()
|
private let lock = NSLock()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user