Browse Source

Fix unifiedsearch crash while reloading metadata

1. Clear cache
2. Go to Files
3. Search something that will produce an updated result (aka something that will return files and fulltext results)
4. The app crashes due to `'RLMException', reason: 'Realm accessed from incorrect thread'` in `reloadDataSource()`

-> Don't specifically use bg (global) thread

- Fix lint for Favourite, Files, Offline

Signed-off-by: Henrik Storch <henrik.storch@nextcloud.com>
Henrik Storch 3 years ago
parent
commit
9297ae7738

+ 0 - 3
.swiftlint.yml

@@ -58,9 +58,7 @@ excluded:
   - iOSClient/EmptyView/NCEmptyDataSet.swift
   - iOSClient/EmptyView/NCEmptyDataSet.swift
   - iOSClient/Extensions/UIColor+Extensions.swift
   - iOSClient/Extensions/UIColor+Extensions.swift
   - iOSClient/Extensions/UIImage+Extensions.swift
   - iOSClient/Extensions/UIImage+Extensions.swift
-  - iOSClient/Favorites/NCFavorite.swift
   - iOSClient/FileViewInFolder/NCFileViewInFolder.swift
   - iOSClient/FileViewInFolder/NCFileViewInFolder.swift
-  - iOSClient/Files/NCFiles.swift
   - iOSClient/Login/NCAppConfigView.swift
   - iOSClient/Login/NCAppConfigView.swift
   - iOSClient/Login/NCLogin.swift
   - iOSClient/Login/NCLogin.swift
   - iOSClient/Login/NCLoginWeb.swift
   - iOSClient/Login/NCLoginWeb.swift
@@ -99,7 +97,6 @@ excluded:
   - iOSClient/Networking/NCOperationQueue.swift
   - iOSClient/Networking/NCOperationQueue.swift
   - iOSClient/Networking/NCService.swift
   - iOSClient/Networking/NCService.swift
   - iOSClient/Notification/NCNotification.swift
   - iOSClient/Notification/NCNotification.swift
-  - iOSClient/Offline/NCOffline.swift
   - iOSClient/Recent/NCRecent.swift
   - iOSClient/Recent/NCRecent.swift
   - iOSClient/Rename file/NCRenameFile.swift
   - iOSClient/Rename file/NCRenameFile.swift
   - iOSClient/RichWorkspace/NCRichWorkspaceCommon.swift
   - iOSClient/RichWorkspace/NCRichWorkspaceCommon.swift

+ 18 - 16
iOSClient/Favorites/NCFavorite.swift

@@ -44,23 +44,25 @@ class NCFavorite: NCCollectionViewCommon {
     override func reloadDataSource() {
     override func reloadDataSource() {
         super.reloadDataSource()
         super.reloadDataSource()
 
 
-        DispatchQueue.global().async {
-
-            if !self.isSearching {
-
-                if self.serverUrl == "" {
-                    self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND favorite == true", self.appDelegate.account))
-                } else {
-                    self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
-                }
+        if !self.isSearching {
+            if self.serverUrl.isEmpty {
+                self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND favorite == true", self.appDelegate.account))
+            } else {
+                self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
             }
             }
+        }
 
 
-            self.dataSource = NCDataSource(metadatasSource: self.metadatasSource, sort: self.layoutForView?.sort, ascending: self.layoutForView?.ascending, directoryOnTop: self.layoutForView?.directoryOnTop, favoriteOnTop: true, filterLivePhoto: true)
-
-            DispatchQueue.main.async {
-                self.refreshControl.endRefreshing()
-                self.collectionView.reloadData()
-            }
+        self.dataSource = NCDataSource(
+            metadatasSource: self.metadatasSource,
+            sort: self.layoutForView?.sort,
+            ascending: self.layoutForView?.ascending,
+            directoryOnTop: self.layoutForView?.directoryOnTop,
+            favoriteOnTop: true,
+            filterLivePhoto: true)
+
+        DispatchQueue.main.async {
+            self.refreshControl.endRefreshing()
+            self.collectionView.reloadData()
         }
         }
     }
     }
 
 
@@ -75,7 +77,7 @@ class NCFavorite: NCCollectionViewCommon {
         isReloadDataSourceNetworkInProgress = true
         isReloadDataSourceNetworkInProgress = true
         collectionView?.reloadData()
         collectionView?.reloadData()
 
 
-        if serverUrl == "" {
+        if serverUrl.isEmpty {
 
 
             NCNetworking.shared.listingFavoritescompletion(selector: NCGlobal.shared.selectorListingFavorite) { _, _, errorCode, errorDescription in
             NCNetworking.shared.listingFavoritescompletion(selector: NCGlobal.shared.selectorListingFavorite) { _, _, errorCode, errorDescription in
                 if errorCode != 0 {
                 if errorCode != 0 {

+ 15 - 10
iOSClient/Files/NCFiles.swift

@@ -70,17 +70,22 @@ class NCFiles: NCCollectionViewCommon {
     override func reloadDataSource() {
     override func reloadDataSource() {
         super.reloadDataSource()
         super.reloadDataSource()
 
 
-        DispatchQueue.main.async {
-
-            if !self.isSearching && self.appDelegate.account != "" && self.appDelegate.urlBase != "" {
-                self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
-                if self.metadataFolder == nil {
-                    self.metadataFolder = NCManageDatabase.shared.getMetadataFolder(account: self.appDelegate.account, urlBase: self.appDelegate.urlBase, serverUrl: self.serverUrl)
-                }
+        if !self.isSearching && !self.appDelegate.account.isEmpty && !self.appDelegate.urlBase.isEmpty {
+            self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
+            if self.metadataFolder == nil {
+                self.metadataFolder = NCManageDatabase.shared.getMetadataFolder(account: self.appDelegate.account, urlBase: self.appDelegate.urlBase, serverUrl: self.serverUrl)
             }
             }
-            
-            self.dataSource = NCDataSource.init(metadatasSource: self.metadatasSource, sort: self.layoutForView?.sort, ascending: self.layoutForView?.ascending, directoryOnTop: self.layoutForView?.directoryOnTop, favoriteOnTop: true, filterLivePhoto: true)
-            
+        }
+
+        self.dataSource = NCDataSource(
+            metadatasSource: self.metadatasSource,
+            sort: self.layoutForView?.sort,
+            ascending: self.layoutForView?.ascending,
+            directoryOnTop: self.layoutForView?.directoryOnTop,
+            favoriteOnTop: true,
+            filterLivePhoto: true)
+
+        DispatchQueue.main.async {
             self.refreshControl.endRefreshing()
             self.refreshControl.endRefreshing()
             self.collectionView.reloadData()
             self.collectionView.reloadData()
         }
         }

+ 47 - 50
iOSClient/Offline/NCOffline.swift

@@ -44,79 +44,76 @@ class NCOffline: NCCollectionViewCommon {
     override func reloadDataSource() {
     override func reloadDataSource() {
         super.reloadDataSource()
         super.reloadDataSource()
 
 
-        DispatchQueue.global().async {
+        var ocIds: [String] = []
 
 
-            var ocIds: [String] = []
-
-            if !self.isSearching {
-
-                if self.serverUrl == "" {
-
-                    if let directories = NCManageDatabase.shared.getTablesDirectory(predicate: NSPredicate(format: "account == %@ AND offline == true", self.appDelegate.account), sorted: "serverUrl", ascending: true) {
-                        for directory: tableDirectory in directories {
-                            ocIds.append(directory.ocId)
-                        }
+        if !self.isSearching {
+            if self.serverUrl.isEmpty {
+                if let directories = NCManageDatabase.shared.getTablesDirectory(predicate: NSPredicate(format: "account == %@ AND offline == true", self.appDelegate.account), sorted: "serverUrl", ascending: true) {
+                    for directory: tableDirectory in directories {
+                        ocIds.append(directory.ocId)
                     }
                     }
-
-                    let files = NCManageDatabase.shared.getTableLocalFiles(predicate: NSPredicate(format: "account == %@ AND offline == true", self.appDelegate.account), sorted: "fileName", ascending: true)
-                    for file: tableLocalFile in files {
-                        ocIds.append(file.ocId)
-                    }
-
-                    self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND ocId IN %@", self.appDelegate.account, ocIds))
-
-                } else {
-
-                    self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
                 }
                 }
-            }
 
 
-            self.dataSource = NCDataSource(metadatasSource: self.metadatasSource, sort: self.layoutForView?.sort, ascending: self.layoutForView?.ascending, directoryOnTop: self.layoutForView?.directoryOnTop, favoriteOnTop: true, filterLivePhoto: true)
+                let files = NCManageDatabase.shared.getTableLocalFiles(predicate: NSPredicate(format: "account == %@ AND offline == true", self.appDelegate.account), sorted: "fileName", ascending: true)
+                for file in files {
+                    ocIds.append(file.ocId)
+                }
 
 
-            DispatchQueue.main.async {
-                self.refreshControl.endRefreshing()
-                self.collectionView.reloadData()
+                self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND ocId IN %@", self.appDelegate.account, ocIds))
+            } else {
+                self.metadatasSource = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", self.appDelegate.account, self.serverUrl))
             }
             }
         }
         }
+
+        self.dataSource = NCDataSource(
+            metadatasSource: self.metadatasSource,
+            sort: self.layoutForView?.sort,
+            ascending: self.layoutForView?.ascending,
+            directoryOnTop: self.layoutForView?.directoryOnTop,
+            favoriteOnTop: true,
+            filterLivePhoto: true)
+
+        DispatchQueue.main.async {
+            self.refreshControl.endRefreshing()
+            self.collectionView.reloadData()
+        }
     }
     }
 
 
     override func reloadDataSourceNetwork(forced: Bool = false) {
     override func reloadDataSourceNetwork(forced: Bool = false) {
         super.reloadDataSourceNetwork(forced: forced)
         super.reloadDataSourceNetwork(forced: forced)
 
 
-        if isSearching {
+        guard !isSearching else {
             networkSearch()
             networkSearch()
             return
             return
         }
         }
 
 
-        if serverUrl == "" {
-
+        guard !serverUrl.isEmpty else {
             self.reloadDataSource()
             self.reloadDataSource()
+            return
+        }
 
 
-        } else {
-
-            isReloadDataSourceNetworkInProgress = true
-            collectionView?.reloadData()
+        isReloadDataSourceNetworkInProgress = true
+        collectionView?.reloadData()
 
 
-            networkReadFolder(forced: forced) { tableDirectory, metadatas, metadatasUpdate, metadatasDelete, errorCode, _ in
-                if errorCode == 0 {
-                    for metadata in metadatas ?? [] {
-                        if !metadata.directory {
-                            if NCManageDatabase.shared.isDownloadMetadata(metadata, download: true) {
-                                NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile)
-                            }
+        networkReadFolder(forced: forced) { tableDirectory, metadatas, metadatasUpdate, metadatasDelete, errorCode, _ in
+            if errorCode == 0 {
+                for metadata in metadatas ?? [] {
+                    if !metadata.directory {
+                        if NCManageDatabase.shared.isDownloadMetadata(metadata, download: true) {
+                            NCOperationQueue.shared.download(metadata: metadata, selector: NCGlobal.shared.selectorDownloadFile)
                         }
                         }
                     }
                     }
                 }
                 }
+            }
 
 
-                DispatchQueue.main.async {
-                    self.refreshControl.endRefreshing()
-                    self.isReloadDataSourceNetworkInProgress = false
-                    self.richWorkspaceText = tableDirectory?.richWorkspace
-                    if metadatasUpdate?.count ?? 0 > 0 || metadatasDelete?.count ?? 0 > 0 || forced {
-                        self.reloadDataSource()
-                    } else {
-                        self.collectionView?.reloadData()
-                    }
+            DispatchQueue.main.async {
+                self.refreshControl.endRefreshing()
+                self.isReloadDataSourceNetworkInProgress = false
+                self.richWorkspaceText = tableDirectory?.richWorkspace
+                if metadatasUpdate?.count ?? 0 > 0 || metadatasDelete?.count ?? 0 > 0 || forced {
+                    self.reloadDataSource()
+                } else {
+                    self.collectionView?.reloadData()
                 }
                 }
             }
             }
         }
         }