From 704c65fcb75198e365469d9b5771e83b453f5f44 Mon Sep 17 00:00:00 2001 From: lithium03 Date: Wed, 4 Dec 2019 04:05:10 +0900 Subject: [PATCH] v1.4.2(64) Fix bugs --- RemoteCloud/RemoteCloud/FileCache.swift | 70 ++++++++++--------- RemoteCloud/RemoteCloud/RemoteStorage.swift | 13 ++-- .../RemoteCloud/Storages/WebDAVStorage.swift | 48 ++++++------- .../project.pbxproj | 4 +- .../Base.lproj/LaunchScreen.storyboard | 11 ++- .../ccViewer/TableViewControllerItems.swift | 13 +++- .../TableViewControllerItemsEdit.swift | 1 + .../TableViewControllerPlaylist.swift | 1 + ccViewer/ccViewer/ViewControllerImage.swift | 2 + 9 files changed, 86 insertions(+), 77 deletions(-) diff --git a/RemoteCloud/RemoteCloud/FileCache.swift b/RemoteCloud/RemoteCloud/FileCache.swift index 079304f..d7f4780 100644 --- a/RemoteCloud/RemoteCloud/FileCache.swift +++ b/RemoteCloud/RemoteCloud/FileCache.swift @@ -30,12 +30,16 @@ public class FileCache { group.leave() return } - var targetURL: URL? self.persistentContainer.performBackgroundTask { context in + defer { + group.leave() + } + var targetURL: URL? let fetchrequest = NSFetchRequest(entityName: "FileCacheItem") fetchrequest.predicate = NSPredicate(format: "storage == %@ && id == %@ && chunkOffset == 0", storage, id) do{ - guard let item = try context.fetch(fetchrequest).first as? FileCacheItem else { + let items = try context.fetch(fetchrequest) + guard let item = items.first as? FileCacheItem else { return } if orgItem.mdate != item.mdate || orgItem.size != item.orgSize { @@ -65,42 +69,42 @@ public class FileCache { } } catch{ - return + print(error) } - } - if let target = targetURL { - do { - let hFile = try FileHandle(forReadingFrom: target) - defer { - do { - if #available(iOS 13.0, *) { - try hFile.close() - } else { - hFile.closeFile() + if let target = targetURL { + do { + let hFile = try FileHandle(forReadingFrom: target) + defer { + do { + if #available(iOS 13.0, *) { + try hFile.close() + } else { + hFile.closeFile() + } + } + catch { + print(error) } } - catch { - print(error) + if #available(iOS 13.0, *) { + try hFile.seek(toOffset: UInt64(offset)) + } else { + hFile.seek(toFileOffset: UInt64(offset)) } - } - if #available(iOS 13.0, *) { - try hFile.seek(toOffset: UInt64(offset)) - } else { - hFile.seek(toFileOffset: UInt64(offset)) - } - if size < 0 { - ret = hFile.readDataToEndOfFile() + if size < 0 { + ret = hFile.readDataToEndOfFile() + return + } + ret = hFile.readData(ofLength: Int(size)) return } - ret = hFile.readData(ofLength: Int(size)) - return - } - catch { - print(error) + catch { + print(error) + } } } } - let _ = group.wait(timeout: .now()+2) + let _ = group.wait() return ret } @@ -123,7 +127,8 @@ public class FileCache { let fetchrequest = NSFetchRequest(entityName: "FileCacheItem") fetchrequest.predicate = NSPredicate(format: "storage == %@ && id == %@ && chunkOffset == %lld", storage, id, offset) do{ - guard let item = try context.fetch(fetchrequest).first as? FileCacheItem else { + let items = try context.fetch(fetchrequest) + guard let item = items.first as? FileCacheItem else { return } if orgItem.mdate != item.mdate || orgItem.size != item.orgSize { @@ -153,12 +158,13 @@ public class FileCache { } } catch{ + print(error) return } } } - let _ = group.wait(timeout: .now()+2) + let _ = group.wait() return ret } @@ -166,7 +172,7 @@ public class FileCache { if getCacheSize() > cacheMaxSize { increseFreeSpace() } - + do { let size = Int64(data.count) let base = try FileManager.default.url(for: .cachesDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("NetCache", isDirectory: true) diff --git a/RemoteCloud/RemoteCloud/RemoteStorage.swift b/RemoteCloud/RemoteCloud/RemoteStorage.swift index 141e5a9..0d49c58 100644 --- a/RemoteCloud/RemoteCloud/RemoteStorage.swift +++ b/RemoteCloud/RemoteCloud/RemoteStorage.swift @@ -583,7 +583,7 @@ public class RemoteStorageBase: NSObject, RemoteStorage { var cancelTime = Date(timeIntervalSince1970: 0) public func cancel() { - cancelTime = Date(timeIntervalSinceNow: 0.1) + cancelTime = Date(timeIntervalSinceNow: 0.5) } public func config() -> String { @@ -661,16 +661,15 @@ public class RemoteStorageBase: NSObject, RemoteStorage { if fileId == "" { let backgroundContext = CloudFactory.shared.data.persistentContainer.newBackgroundContext() self.deleteChild(parent: fileId, context: backgroundContext) - backgroundContext.performAndWait { + backgroundContext.perform { try? backgroundContext.save() + self.ListChildren(onFinish: onFinish) } - self.ListChildren(onFinish: onFinish) } else { var path = "" let backgroundContext = CloudFactory.shared.data.persistentContainer.newBackgroundContext() - - backgroundContext.performAndWait { + backgroundContext.perform { let fetchRequest = NSFetchRequest(entityName: "RemoteData") fetchRequest.predicate = NSPredicate(format: "id == %@ && storage == %@", fileId, self.storageName ?? "") if let result = try? backgroundContext.fetch(fetchRequest) { @@ -683,7 +682,7 @@ public class RemoteStorageBase: NSObject, RemoteStorage { self.deleteChild(parent: fileId, context: backgroundContext) } } - backgroundContext.performAndWait { + backgroundContext.perform { if path != "" { try? backgroundContext.save() self.ListChildren(fileId: fileId, path: path, onFinish: onFinish) @@ -702,7 +701,7 @@ public class RemoteStorageBase: NSObject, RemoteStorage { else { var ids: [String] = [] let backgroundContext = CloudFactory.shared.data.persistentContainer.newBackgroundContext() - backgroundContext.performAndWait { + backgroundContext.perform { let fetchRequest = NSFetchRequest(entityName: "RemoteData") fetchRequest.predicate = NSPredicate(format: "path == %@", path) if let result = try? backgroundContext.fetch(fetchRequest), let items = result as? [RemoteData] { diff --git a/RemoteCloud/RemoteCloud/Storages/WebDAVStorage.swift b/RemoteCloud/RemoteCloud/Storages/WebDAVStorage.swift index 24a80d6..7621d47 100644 --- a/RemoteCloud/RemoteCloud/Storages/WebDAVStorage.swift +++ b/RemoteCloud/RemoteCloud/Storages/WebDAVStorage.swift @@ -313,15 +313,6 @@ public class WebDAVStorage: NetworkStorage, URLSessionTaskDelegate, URLSessionDa return .WebDAV } - public override func cancel() { - if let acceptRange = acceptRange, !acceptRange { - cancelTime = Date(timeIntervalSinceNow: 10) - } - else { - super.cancel() - } - } - var cache_accessUsername = "" var accessUsername: String { if let name = storageName { @@ -377,6 +368,7 @@ public class WebDAVStorage: NetworkStorage, URLSessionTaskDelegate, URLSessionDa var recvData: [Int: Data] = [:] var headerHandler: [Int: (URLResponse)->URLSession.ResponseDisposition] = [:] + let wholeQueue = DispatchQueue(label: "WholeReading") var wholeReading: [URL] = [] public func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { @@ -1040,9 +1032,8 @@ public class WebDAVStorage: NetworkStorage, URLSessionTaskDelegate, URLSessionDa } } //print(url) - - if wholeReading.contains(url) { - DispatchQueue.global().asyncAfter(deadline: .now()+Double.random(in: 1..<5)) { + if wholeQueue.sync(execute: { wholeReading.contains(url) }) { + DispatchQueue.global().asyncAfter(deadline: .now()+Double.random(in: 0..<1)) { if self.cancelTime.timeIntervalSinceNow > 0 { self.cancelTime = Date(timeIntervalSinceNow: 0.5) onFinish?(nil) @@ -1065,33 +1056,34 @@ public class WebDAVStorage: NetworkStorage, URLSessionTaskDelegate, URLSessionDa return } lastCall = Date() - wholeReading += [url] - + wholeQueue.async { + self.wholeReading += [url] + } + var request: URLRequest request = URLRequest(url: url) - os_log("%{public}@", log: log, type: .debug, "readFile(WebDAV:\(storageName ?? "") \(fileId) whole read") + os_log("%{public}@", log: log, type: .debug, "readFile(WebDAV:\(storageName ?? "") \(fileId) whole read \(start ?? 0) \(length ?? -1)") let task = dataSession.dataTask(with: request) - let timer1 = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { t in - if self.cancelTime.timeIntervalSinceNow > 0 { - print("cancel") - self.cancelTime = Date(timeIntervalSinceNow: 1) - onFinish?(nil) - task.cancel() - return + var timer1: Timer? + DispatchQueue.main.async { + timer1 = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { t in + if self.cancelTime.timeIntervalSinceNow > 0 { + print("cancel") + task.cancel() + self.cancelTime = Date(timeIntervalSinceNow: 0.5) + onFinish?(nil) + return + } } } dataTasks[task.taskIdentifier] = { data, error in - self.callSemaphore.signal() - timer1.invalidate() - var waittime = self.callWait if let error = error { print(error) - if (error as NSError).code == -1009 { - waittime += 30 - } } + self.callSemaphore.signal() + timer1?.invalidate() if let d = data { CloudFactory.shared.cache.saveFile(storage: self.storageName!, id: fileId, data: d) let s = Int(start ?? 0) diff --git a/ccViewer/CryptCloudViewer.xcodeproj/project.pbxproj b/ccViewer/CryptCloudViewer.xcodeproj/project.pbxproj index dd3b98f..59a47d5 100644 --- a/ccViewer/CryptCloudViewer.xcodeproj/project.pbxproj +++ b/ccViewer/CryptCloudViewer.xcodeproj/project.pbxproj @@ -803,7 +803,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = ccViewer/ccViewer.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 62; + CURRENT_PROJECT_VERSION = 64; DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES; DEVELOPMENT_TEAM = 7A9X38B4YU; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; @@ -838,7 +838,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = ccViewer/ccViewer.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 62; + CURRENT_PROJECT_VERSION = 64; DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = YES; DEVELOPMENT_TEAM = 7A9X38B4YU; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; diff --git a/ccViewer/ccViewer/Base.lproj/LaunchScreen.storyboard b/ccViewer/ccViewer/Base.lproj/LaunchScreen.storyboard index 3afcc21..e0cb633 100644 --- a/ccViewer/ccViewer/Base.lproj/LaunchScreen.storyboard +++ b/ccViewer/ccViewer/Base.lproj/LaunchScreen.storyboard @@ -1,11 +1,9 @@ - - - - + + - + @@ -20,6 +18,7 @@ + @@ -40,6 +39,6 @@ - + diff --git a/ccViewer/ccViewer/TableViewControllerItems.swift b/ccViewer/ccViewer/TableViewControllerItems.swift index 7fb1285..0dc52ff 100644 --- a/ccViewer/ccViewer/TableViewControllerItems.swift +++ b/ccViewer/ccViewer/TableViewControllerItems.swift @@ -309,6 +309,7 @@ class TableViewControllerItems: UITableViewController, UISearchResultsUpdating, super.didMove(toParent: parent) if parent == nil { gone = false + semaphore.signal() } } @@ -934,7 +935,10 @@ class TableViewControllerItems: UITableViewController, UISearchResultsUpdating, if newroot.count == 0 { self.activityIndicator.startAnimating() DispatchQueue.global().async { - CloudFactory.shared[self.storageName]?.list(fileId: self.result[indexPath.row].id ?? "") { + CloudFactory.shared[self.storageName]?.list(fileId: self.result[indexPath.row].id ?? "") { [weak self] in + guard let self = self else { + return + } DispatchQueue.main.async { self.activityIndicator.stopAnimating() self.semaphore.signal() @@ -964,7 +968,10 @@ class TableViewControllerItems: UITableViewController, UISearchResultsUpdating, if newroot.count == 0 { activityIndicator.startAnimating() - (CloudFactory.shared[storageName] as? RemoteSubItem)?.listsubitem(fileId: result[indexPath.row].id ?? "") { + (CloudFactory.shared[storageName] as? RemoteSubItem)?.listsubitem(fileId: result[indexPath.row].id ?? "") { [weak self] in + guard let self = self else { + return + } DispatchQueue.main.async { self.activityIndicator.stopAnimating() self.semaphore.signal() @@ -1314,6 +1321,7 @@ class TableViewControllerItems: UITableViewController, UISearchResultsUpdating, guard self.downloadProgress.isLive else { self.semaphore.signal() stream.isLive = false + item.cancel() return } DispatchQueue.main.async { @@ -1359,6 +1367,7 @@ class TableViewControllerItems: UITableViewController, UISearchResultsUpdating, guard self.downloadProgress.isLive else { self.semaphore.signal() stream.isLive = false + item.cancel() return } DispatchQueue.main.async { diff --git a/ccViewer/ccViewer/TableViewControllerItemsEdit.swift b/ccViewer/ccViewer/TableViewControllerItemsEdit.swift index 735a035..df9d9ff 100644 --- a/ccViewer/ccViewer/TableViewControllerItemsEdit.swift +++ b/ccViewer/ccViewer/TableViewControllerItemsEdit.swift @@ -238,6 +238,7 @@ class TableViewControllerItemsEdit: UITableViewController, UISearchResultsUpdati override func didMove(toParent parent: UIViewController?) { if parent == nil { gone = false + semaphore.signal() } } diff --git a/ccViewer/ccViewer/TableViewControllerPlaylist.swift b/ccViewer/ccViewer/TableViewControllerPlaylist.swift index 048f1be..c5dd366 100644 --- a/ccViewer/ccViewer/TableViewControllerPlaylist.swift +++ b/ccViewer/ccViewer/TableViewControllerPlaylist.swift @@ -96,6 +96,7 @@ class TableViewControllerPlaylist: UITableViewController, UISearchResultsUpdatin super.didMove(toParent: parent) if parent == nil { gone = false + semaphore.signal() } } diff --git a/ccViewer/ccViewer/ViewControllerImage.swift b/ccViewer/ccViewer/ViewControllerImage.swift index 4b34c88..6a195bc 100644 --- a/ccViewer/ccViewer/ViewControllerImage.swift +++ b/ccViewer/ccViewer/ViewControllerImage.swift @@ -243,6 +243,7 @@ class ViewControllerImage: UIViewController, UIScrollViewDelegate, UIDocumentInt self.isDownloading = false guard self.downloadProgress.isLive else { stream.isLive = false + self.items[idx].cancel() return } DispatchQueue.main.async { @@ -362,6 +363,7 @@ class ViewControllerImage: UIViewController, UIScrollViewDelegate, UIDocumentInt }) { data in guard self.downloadProgress.isLive else { stream.isLive = false + self.items[self.itemIdx].cancel() return } DispatchQueue.main.async {