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
})