the programming language different and swift performselector ios8

swift - programming - Alternativa rápida para realizarSelectorOnMainThread



the swift programming language 4.1 pdf (6)

// Xcode 8.2 // swift 3.0

Estoy accediendo a una API que proporciona los datos sobre el clima, es decir, ''temperatura'', ''humedad'', ''presión'', etc. después de enviar el nombre o código postal de cualquier ciudad. Por lo tanto, esos datos deben mostrarse ( debe estar en el subproceso principal ) en la interfaz de usuario ( la vista de tabla )

self.performSelector(onMainThread: #selector(Home.DataOnUI), with: nil, waitUntilDone: true)

//

func DataOnUI() { self.tblView.reloadData() }

PS Home es la clase de UIViewController

Quiero volver a cargar los datos de mi tabla dentro de un bloque en este método:

import UIKit import AssetsLibrary class AlbumsTableViewController: UITableViewController { var albums:ALAssetsGroup[] = [] func loadAlbums(){ let library = IAAssetsLibraryDefaultInstance library.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupAll), usingBlock: {(group, stop) in if group { self.albums.append(group) } else { dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() }) } }, failureBlock: { (error:NSError!) in println("Problem loading albums: /(error)") }) } override func viewDidLoad() { super.viewDidLoad() loadAlbums() // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. //self.navigationItem.rightBarButtonItem = self.editButtonItem }

Pero el bloque else no se ejecutará. El error que recibo es:

''performSelectorOnMainThread'' is unavailable: ''performSelector'' methods are unavailable

Entonces, ¿cuál es la alternativa a ''performSelectorOnMainThread'' en swift?

ACTUALIZAR:

Ahora estoy recibiendo un error de cancelación.


Está llamando a performSelectorOnMainThread en UIViewController en lugar del objeto de UITableView

Puede ser tu código:

self.performSelectorOnMainThread(Selector(reloadData), withObject: self.tblMainTable, waitUntilDone: true)

En lugar de:

self.tblMainTable.performSelectorOnMainThread(Selector("reloadData"), withObject: nil, waitUntilDone: true)

está recibiendo ese mensaje porque UIViewController no tiene ningún método llamado "performSelectorOnMainThread"


Esta simple función C:

dispatch_async(dispatch_get_main_queue(), { // DO SOMETHING ON THE MAINTHREAD self.tableView.reloadData() })

¿Qué hay de lanzar tu función con:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { loadAlbums() })

en viewDidLoad ()?


Utilice GCD en lugar de realizar variaciones del selector.

dispatch_async(dispatch_get_main_queue()) { () -> Void in self.doSomething() }


Swift 3 / Xcode 8.2

Aquí hay una forma rápida de hacer las cosas. Simplemente inserte el tiempo (en segundos) que desea que se ejecute el código después.

let delayTime = DispatchTime.now() + Double(Int64(20.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) DispatchQueue.main.asyncAfter(deadline: delayTime) { //Your code to run after 20 seconds }

Alternativamente, puede simplemente colocar su demora de tiempo en una notación de una línea de esta manera:

DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) { // Your code to run after 10 seconds }


Swift 3

DispatchQueue.main.async(execute: { //Code to execute on main thread })