From 99e5193a960db22365eb99c20d686c832fb96117 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Tue, 13 Sep 2016 15:12:05 -0400 Subject: [PATCH] ArticleLoadOperation --- .../Controller/Main/MainController.swift | 2 - .../Main/MainControllerDelegates.swift | 7 ++ .../Controller/Search/SearchResultTBVC.swift | 7 +- Kiwix-iOS/Info.plist | 2 +- Kiwix-iOSWidgets/Bookmarks/Info.plist | 2 +- Kiwix/Operations/ArticleOperation.swift | 64 +++++++++++++++++-- Kiwix/Operations/GlobalQueue.swift | 19 ++++-- 7 files changed, 86 insertions(+), 17 deletions(-) diff --git a/Kiwix-iOS/Controller/Main/MainController.swift b/Kiwix-iOS/Controller/Main/MainController.swift index 4a96a3f6..b76291b4 100644 --- a/Kiwix-iOS/Controller/Main/MainController.swift +++ b/Kiwix-iOS/Controller/Main/MainController.swift @@ -125,8 +125,6 @@ class MainController: UIViewController { return } guard let url = url else {return} - webView.hidden = false - hideWelcome() let request = NSURLRequest(URL: url) webView.loadRequest(request) } diff --git a/Kiwix-iOS/Controller/Main/MainControllerDelegates.swift b/Kiwix-iOS/Controller/Main/MainControllerDelegates.swift index 0709b505..97ee6c7f 100644 --- a/Kiwix-iOS/Controller/Main/MainControllerDelegates.swift +++ b/Kiwix-iOS/Controller/Main/MainControllerDelegates.swift @@ -25,6 +25,13 @@ extension MainController: UIWebViewDelegate, SFSafariViewControllerDelegate, func webViewDidStartLoad(webView: UIWebView) { URLResponseCache.shared.start() + + // UI Updates + if webView.hidden { + webView.hidden = false + hideWelcome() + } + hideSearch(animated: true) } func webViewDidFinishLoad(webView: UIWebView) { diff --git a/Kiwix-iOS/Controller/Search/SearchResultTBVC.swift b/Kiwix-iOS/Controller/Search/SearchResultTBVC.swift index 9ee0bb09..225d8f04 100644 --- a/Kiwix-iOS/Controller/Search/SearchResultTBVC.swift +++ b/Kiwix-iOS/Controller/Search/SearchResultTBVC.swift @@ -106,11 +106,10 @@ class SearchResultTBVC: UIViewController, UITableViewDataSource, UITableViewDele func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) - guard let mainVC = parentViewController?.parentViewController as? MainController else {return} + let result = searchResults[indexPath.row] - let url = NSURL.kiwixURLWithZimFileid(result.bookID, articleTitle: result.title) - mainVC.load(url) - mainVC.hideSearch(animated: true) + let operation = ArticleLoadOperation(bookID: result.bookID, articleTitle: result.title) + GlobalQueue.shared.add(load: operation) } // MARK: - Search diff --git a/Kiwix-iOS/Info.plist b/Kiwix-iOS/Info.plist index 50a99629..53d51121 100644 --- a/Kiwix-iOS/Info.plist +++ b/Kiwix-iOS/Info.plist @@ -49,7 +49,7 @@ CFBundleVersion - 1.8.369 + 1.8.401 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/Kiwix-iOSWidgets/Bookmarks/Info.plist b/Kiwix-iOSWidgets/Bookmarks/Info.plist index cdc7e530..f681c246 100644 --- a/Kiwix-iOSWidgets/Bookmarks/Info.plist +++ b/Kiwix-iOSWidgets/Bookmarks/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 1.8.372 + 1.8.404 NSExtension NSExtensionMainStoryboard diff --git a/Kiwix/Operations/ArticleOperation.swift b/Kiwix/Operations/ArticleOperation.swift index 3f13d3de..ce10f086 100644 --- a/Kiwix/Operations/ArticleOperation.swift +++ b/Kiwix/Operations/ArticleOperation.swift @@ -10,15 +10,71 @@ import UIKit import Operations class ArticleLoadOperation: Operation { - let url: NSURL + let bookID: String? + let path: String? + let title: String? + let url: NSURL? - init?(url: NSURL) { + init(url: NSURL) { + self.bookID = nil + self.path = nil + self.title = nil self.url = url super.init() } - override func execute() { - + init(bookID: String) { + self.bookID = bookID + self.path = nil + self.title = nil + self.url = nil + super.init() } + init(bookID: String, articlePath: String) { + self.bookID = bookID + self.path = articlePath + self.title = nil + self.url = nil + super.init() + } + + init(bookID: String, articleTitle: String) { + self.bookID = bookID + self.path = nil + self.title = articleTitle + self.url = nil + super.init() + } + + override func execute() { + let controller = ((UIApplication.sharedApplication().delegate as! AppDelegate) + .window?.rootViewController as! UINavigationController) + .topViewController as! MainController + guard let url: NSURL = { + if let url = self.url { return url} + if let bookID = bookID, let path = path { return NSURL(bookID: bookID, contentPath: path) } + if let bookID = bookID, let title = title { + guard let path = ZimMultiReader.shared.readers[bookID]?.pageURLFromTitle(title) else {return nil} + return NSURL(bookID: bookID, contentPath: path) + } + if let bookID = bookID { + guard let reader = ZimMultiReader.shared.readers[bookID] else {return nil} + let path = reader.mainPageURL() + return NSURL(bookID: bookID, contentPath: path) + } + return nil + }() else { + // TODO - should produce error + finish() + return + } + + let request = NSURLRequest(URL: url) + + NSOperationQueue.mainQueue().addOperationWithBlock { + controller.webView.loadRequest(request) + self.finish() + } + } } diff --git a/Kiwix/Operations/GlobalQueue.swift b/Kiwix/Operations/GlobalQueue.swift index 2711c520..9b30ec54 100644 --- a/Kiwix/Operations/GlobalQueue.swift +++ b/Kiwix/Operations/GlobalQueue.swift @@ -13,6 +13,7 @@ class GlobalQueue: OperationQueue { private weak var scanOperation: ScanLocalBookOperation? private weak var searchOperation: SearchOperation? + private weak var articleLoadOperation: ArticleLoadOperation? func add(scan operation: ScanLocalBookOperation) { addOperation(operation) @@ -20,13 +21,8 @@ class GlobalQueue: OperationQueue { } func add(search operation: SearchOperation) { - if let _ = searchOperation { - print("search is not released") - } - if let scanOperation = scanOperation { operation.addDependency(scanOperation) - print("scan not finished") } if let searchOperation = self.searchOperation { @@ -35,6 +31,19 @@ class GlobalQueue: OperationQueue { addOperation(operation) searchOperation = operation } + + func add(load operation: ArticleLoadOperation) { + if let scanOperation = scanOperation { + operation.addDependency(scanOperation) + } + + if let articleLoadOperation = self.articleLoadOperation { + operation.addDependency(articleLoadOperation) + } + + addOperation(operation) + articleLoadOperation = operation + } } public enum OperationErrorCode: Int {