web-dev-qa-db-fra.com

Alternative rapide à performSelectorOnMainThread

Je veux recharger mes données de table à l'intérieur d'un bloc dans cette méthode:

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
    }

Mais le bloc else ne sera pas exécuté. L'erreur que je reçois est:

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

Alors, quelle est l'alternative à 'performSelectorOnMainThread' dans swift?

METTRE À JOUR:

Je reçois maintenant une erreur d'abandon.

17
Amit Erandole

Cette simple fonction C:

dispatch_async(dispatch_get_main_queue(), {

        // DO SOMETHING ON THE MAINTHREAD
        self.tableView.reloadData()
        })

Qu'en est-il du lancement de votre fonction avec:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

        loadAlbums()

})

dans viewDidLoad ()?

40
Ben

Swift 3

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

Utilisez GCD au lieu des variations performSelector.

dispatch_async(dispatch_get_main_queue()) {
        () -> Void in
        self.doSomething()
    }
2
Ah Ryun Moon

Vous appelez performSelectorOnMainThread sur UIViewController au lieu de l'objet UITableView

Peut-être votre code:

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

Au lieu de:

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

vous recevez ce message car UIViewController n'a aucune méthode nommée "performSelectorOnMainThread"

1
Anand Suthar