2016-07-14 12 views
1

Ich habe diesen Code, um verschiedene Tabellen zu durchsuchen, mein Problem ist, dass ich nicht mit der Benutzeroberfläche interagieren kann, bis die Las Fetch-Anfrage ausgeführt wird. Wenn ich nach einem bestimmten Wert suche und das Ergebnis in "Table2" ist, wird das TableView zwar aktualisiert, kann aber erst dann mit ihm interagieren, wenn die letzte Tabelle durchsucht wurde. Die Ausführung von func loadData() dauert nur wenige Millisekunden, um ausgeführt und beendet zu werden, und die Abrufe werden in einem anderen Thread ausgeführt. Ich weiß nicht, was mit diesem Code, Hilfe oder Rat falsch ist? Die Gesamtanzahl der Datensätze in allen Tabellen beträgt ca. 5 Millionen. Es dauert einige Zeit, alle zu durchsuchen, deshalb möchte ich den Benutzer nicht warten lassen, wenn einige Ergebnisse verfügbar sind, bevor die Suche beendet wird.UI hängt, bis alle Abrufe fertig sind

func loadData() { 
    let tablas = ["Table1", "Table2", "Table3", "Table4", "Table5", "Table6", "Table7", "Table8", "Table9", "Table10", "Table11"] 
    let managedContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 
    managedContext.parentContext = self.moc 
    for tbl in tablas { 
     managedContext.performBlock { 
      let fetchRequest = NSFetchRequest(entityName: tbl) 
      let predicate = NSPredicate(format: "name CONTAINS %@", self.filter) 
      fetchRequest.predicate = predicate 
      fetchRequest.resultType = NSFetchRequestResultType.ManagedObjectIDResultType 
      fetchRequest.fetchLimit = 50 
      fetchRequest.fetchBatchSize = 10 
      do { 
       let results = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObjectID] 
       if results.count != 0 { 
        self.resultArray.appendContentsOf(results) 
        dispatch_async(dispatch_get_main_queue()) { 
         self.tableView.reloadData() 
        } 
       } 
      } catch let error as NSError { 
       dispatch_async(dispatch_get_main_queue()) { 
        let errorAlert = UIAlertController(title: "Error!!!", message: error.localizedDescription, preferredStyle: .Alert) 
        errorAlert.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: nil)) 
        self.presentViewController(errorAlert, animated: true, completion: nil) 
       } 
      } 
     } 
    } 
} 
+0

Warum Sie zuerst 5-10 Inhalt und implementieren ziehen zu aktualisieren und fügen 5-10 neue Datensätze nicht geladen werden. – gurmandeep

+0

Die meisten Suchen werden weniger als 10 Ergebnisse haben, ich möchte den Benutzer nicht bitten, zu aktualisieren und warten, um 2 oder wahrscheinlich 0 Datensätze zu laden. verwenden – cubick84

+0

Dann dispatch_async (dispatch_get_main_queue() { }) – gurmandeep

Antwort

0

Die UI-Griffe im Hauptthread die meisten seiner Prozessplanung. Wenn Sie einen Hauptprozess haben, führen Sie ihn nicht synchron zum Hauptthread aus. Sie können es asynchron im Hauptthread ausführen.

Der Code auf Haupt-Thread asynchron auszuführen:

dispatch_async(dispatch_get_main_queue(), { 

    // RUN CODE OVER HERE 

}) 
+0

Mein Hauptprozess sind die Abrufe und läuft in einem anderen Thread ("managedContext.performBlock"), der Code, den Sie mir zur Verfügung stellen, ist es, auf den Haupt-Thread zuzugreifen und die Benutzeroberfläche zu aktualisieren. – cubick84

Verwandte Themen