Multiple changes

- iPhone js, adjust thumbs layout, now they take up the whole width
- NetworkObserver, correct task count
- refactor and very minor improvements
This commit is contained in:
Chris Li 2016-06-21 13:58:09 -04:00
parent cd134e785e
commit 553a464157
8 changed files with 63 additions and 19 deletions

View File

@ -45,7 +45,7 @@ class LibraryDownloadTBVC: UITableViewController, NSFetchedResultsControllerDele
let downloadTask = fetchedResultController.objectAtIndexPath(indexPath) as? DownloadTask, let downloadTask = fetchedResultController.objectAtIndexPath(indexPath) as? DownloadTask,
let book = downloadTask.book else {return} let book = downloadTask.book else {return}
switch downloadTask.state { switch downloadTask.state {
case .Downloading: case .Downloading, .Queued:
Network.sharedInstance.pause(book) Network.sharedInstance.pause(book)
case .Paused, .Error: case .Paused, .Error:
Network.sharedInstance.resume(book) Network.sharedInstance.resume(book)

View File

@ -123,8 +123,6 @@ class SearchResultTBVC: UIViewController, UITableViewDataSource, UITableViewDele
if results.count > 0 { if results.count > 0 {
self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true) self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
} }
// This line below works prefectly if tableview doesn't hide keyboard on drag
//self.tableView.setContentOffset(CGPointMake(0, 0 - self.tableView.contentInset.top), animated: true)
} }
ZIMMultiReader.sharedInstance.searchQueue.addOperation(operation) ZIMMultiReader.sharedInstance.searchQueue.addOperation(operation)
} }

View File

@ -36,7 +36,7 @@
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>291</string> <string>366</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>

View File

@ -1,13 +1,41 @@
/** /**
* Created by chrisli on 10/5/15. * Created by chrisli on 10/5/15.
*/ */
var tables = document.getElementsByTagName("table"); function adjustTables() {
var i; var tables = document.getElementsByTagName("table");
for (i = 0; i < tables.length; i++) { var i;
org_html = tables[i].outerHTML; for (i = 0; i < tables.length; i++) {
new_html = "<div id='slidesInner' style ='width:100%;'>" + org_html + "</div>"; org_html = tables[i].outerHTML;
tables[i].outerHTML = new_html; new_html = "<div id='slidesInner' style ='width:100%;'>" + org_html + "</div>";
tables[i].parentNode.style.overflow = "auto"; tables[i].outerHTML = new_html;
tables[i].style.margin = "auto"; tables[i].parentNode.style.overflow = "auto";
tables[i].style.width = "100%"; tables[i].style.margin = "auto";
} tables[i].style.width = "100%";
}
}
function adjustThumbLayout(thumbs) {
var i;
for (i = 0; i < thumbs.length; i++) {
thumbs[i].style.width = "100%";
thumbs[i].style.paddingLeft = "4px";
thumbs[i].style.paddingRight = "4px";
var inner = thumbs[i].getElementsByClassName("thumbinner")[0];
if (inner) {
inner.style.width = "100%";
var captions = inner.getElementsByClassName("thumbcaption");
var j;
for (j= 0; j < captions.length; j++) {
captions[j].style.textAlign = "center";
}
}
}
}
adjustTables();
adjustThumbLayout(document.getElementsByClassName("thumb tright"));
adjustThumbLayout(document.getElementsByClassName("thumb tleft"));
adjustThumbLayout(document.getElementsByClassName("thumb tmulti tright"));
adjustThumbLayout(document.getElementsByClassName("thumb tmulti tleft"));

View File

@ -18,6 +18,7 @@ struct NetworkObserver: OperationObserver {
init() { } init() { }
func operationDidStart(operation: Operation) { func operationDidStart(operation: Operation) {
print("NetworkObserver: \(operation.name ?? "Unknown") operation did start")
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {
// Increment the network indicator's "reference count" // Increment the network indicator's "reference count"
NetworkIndicatorController.sharedIndicatorController.networkActivityDidStart() NetworkIndicatorController.sharedIndicatorController.networkActivityDidStart()
@ -27,13 +28,19 @@ struct NetworkObserver: OperationObserver {
func operation(operation: Operation, didProduceOperation newOperation: NSOperation) { } func operation(operation: Operation, didProduceOperation newOperation: NSOperation) { }
func operationDidFinish(operation: Operation, errors: [NSError]) { func operationDidFinish(operation: Operation, errors: [NSError]) {
// If an op is cancelled, operationDidStart will not be called
print("NetworkObserver: \(operation.name ?? "Unknown") operation did finish")
guard !operation.cancelled else {return}
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {
// Decrement the network indicator's "reference count". // Decrement the network indicator's "reference count".
NetworkIndicatorController.sharedIndicatorController.networkActivityDidEnd() NetworkIndicatorController.sharedIndicatorController.networkActivityDidEnd()
} }
} }
func operationDidCancel(operation: Operation) { } func operationDidCancel(operation: Operation) {
print("NetworkObserver: \(operation.name ?? "Unknown") operation did cancel")
}
} }

View File

@ -28,6 +28,7 @@ class RefreshLibraryOperation: GroupOperation {
parseOperation.xmlData = data parseOperation.xmlData = data
} }
let fetchOperation = URLSessionTaskOperation(task: task) let fetchOperation = URLSessionTaskOperation(task: task)
fetchOperation.name = "Library XML download operation"
#if os(iOS) || os(watchOS) || os(tvOS) #if os(iOS) || os(watchOS) || os(tvOS)
fetchOperation.addObserver(NetworkObserver()) fetchOperation.addObserver(NetworkObserver())

View File

@ -24,7 +24,7 @@ class SearchOperation: GroupOperation {
let managedObjectContext = UIApplication.appDelegate.managedObjectContext let managedObjectContext = UIApplication.appDelegate.managedObjectContext
guard let book = Book.fetch(id, context: managedObjectContext) else {continue} guard let book = Book.fetch(id, context: managedObjectContext) else {continue}
guard book.includeInSearch else {continue} guard book.includeInSearch else {continue}
let operation = SingleBookSearchOperation(zimReader: zimReader, searchTerm: searchTerm, completionHandler: { [unowned sortOperation] (results) in let operation = SingleBookSearchOperation(zimReader: zimReader, searchTerm: searchTerm.lowercaseString, completionHandler: { [unowned sortOperation] (results) in
sortOperation.results += results sortOperation.results += results
}) })
@ -61,6 +61,7 @@ private class SingleBookSearchOperation: Operation {
var results = [SearchResult]() var results = [SearchResult]()
for dic in resultDics { for dic in resultDics {
guard let result = SearchResult(rawResult: dic) else {continue} guard let result = SearchResult(rawResult: dic) else {continue}
print(result)
results.append(result) results.append(result)
} }
completionHandler(results) completionHandler(results)
@ -77,7 +78,7 @@ private class SortSearchResultsOperation: Operation {
} }
override private func execute() { override private func execute() {
sortBySearchMethod() sort()
completionHandler(results) completionHandler(results)
finish() finish()
} }
@ -87,7 +88,7 @@ private class SortSearchResultsOperation: Operation {
2. Among Xapian results: sort by percent, then title case insensitive compare 2. Among Xapian results: sort by percent, then title case insensitive compare
3. Among searchSuggestionSmart results: sort by title case insensitive compare 3. Among searchSuggestionSmart results: sort by title case insensitive compare
*/ */
private func sortBySearchMethod() { private func sort() {
results.sortInPlace { (result0, result1) -> Bool in results.sortInPlace { (result0, result1) -> Bool in
let result0Percent = result0.percent ?? -1 let result0Percent = result0.percent ?? -1
let result1Percent = result1.percent ?? -1 let result1Percent = result1.percent ?? -1

View File

@ -160,10 +160,11 @@ extension ZimReader {
} }
} }
class SearchResult { class SearchResult: CustomStringConvertible {
let bookID: String let bookID: String
let title: String let title: String
let percent: Double? // range: 0-100 let percent: Double? // range: 0-100
let distance: Int64 // Levenshtein distance, non negative integer
let path: String? let path: String?
let snippet: String? let snippet: String?
@ -172,10 +173,18 @@ class SearchResult {
self.title = (rawResult["title"] as? String) ?? "" self.title = (rawResult["title"] as? String) ?? ""
self.percent = (rawResult["percent"] as? NSNumber)?.doubleValue self.percent = (rawResult["percent"] as? NSNumber)?.doubleValue
self.distance = (rawResult["distance"]as? NSNumber)?.longLongValue ?? 0
self.path = rawResult["path"] as? String self.path = rawResult["path"] as? String
self.snippet = rawResult["snippet"] as? String self.snippet = rawResult["snippet"] as? String
if bookID == "" {return nil} if bookID == "" {return nil}
if title == "" {return nil} if title == "" {return nil}
} }
var description: String {
var parts = [bookID, title]
if let percent = percent {parts.append("\(percent)%")}
parts.append("dist: \(distance)")
return parts.joinWithSeparator(", ")
}
} }