2014-06-09 14 views
16

voglio ricaricare i miei dati della tabella all'interno di un blocco in questo metodo:Swift alternativa al performSelectorOnMainThread

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 
    } 

Ma il blocco else non verrà eseguito. L'errore che ottengo è:

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

Allora, qual è l'alternativa a 'performSelectorOnMainThread' in rapida?

UPDATE:

ora sto ottenendo un errore di interruzione. Ecco ciò che il console si presenta come: http://cl.ly/image/3D0h1x433P0R

+0

GCD è stato preferito su 'performSelectorOnMainThread' in Objective -C per un po 'ora, controlla i documenti qui: https: //developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html – Jack

risposta

39

Questa semplice C-funzione:

dispatch_async(dispatch_get_main_queue(), { 

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

Che dire di lanciare la vostra funzione con:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     loadAlbums() 

}) 

in viewDidLoad()?

+0

Sì, funziona Ben –

+0

Prego. Si prega di contrassegnare la risposta come risposta corretta, in modo che le altre persone vedano immediatamente la risposta :) – Ben

+0

Ho parlato troppo presto - Ora sto ricevendo un errore che non so nemmeno come eseguire il debug: http://cl.ly/image/1d272E263V2N - si prega di dare un'occhiata –

2

Utilizzare GCD al posto delle variazioni di performSelector.

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

Si sta chiamando performSelectorOnMainThread su UIViewController invece oggetto di UITableView

Può essere il tuo codice:

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

Invece di:

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

hai trovato quel messaggio perché UIViewController d oes't avere alcun metodo denominato "performSelectorOnMainThread"

1

// Xcode 8.2 // SWIFT 3.0

Io sono l'accesso un'API che fornisce i dati relativi a tempo cioe 'temperatura', 'umidita', 'pressione', ecc dopo aver inviato il nome o il codice postale di qualsiasi città. Quindi, che hanno bisogno di dati da visualizzare (esso deve essere il filo principale) sulla UI (la tableView)

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

//

func DataOnUI() { 

    self.tblView.reloadData() 
} 

P.S. Home è la classe dei UIViewController

+0

Descrivi anche la tua soluzione in poche parole. –

-1

Swift 3/Xcode 8.2

Ecco un modo Swift 3 di fare le cose. Basta inserire il tempo (in secondi) che si desidera eseguire dopo il codice.

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 
    } 

In alternativa si può semplicemente inserire il vostro tempo di ritardo in una linea di notazione in questo modo:

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

Swift 3

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