2014-06-09 9 views
16

Ich möchte meine Tabellendaten innerhalb eines Blocks in diesem Verfahren erneut zu laden:Swift Alternative zu 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 
    } 

Aber der sonst Block wird nicht ausgeführt. Der Fehler, den ich bekommen ist:

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

Also, was ist die Alternative zu 'performSelectorOnMainThread' in schnellen?

UPDATE:

Ich bin jetzt ein Abbruch Fehler. Hier ist, was die Konsole wie folgt aussieht: http://cl.ly/image/3D0h1x433P0R

+0

GCD über 'performSelectorOnMainThread' bevorzugt wurde in Objective -C Schauen Sie sich die Dokumente seit einiger Zeit hier an: https: //developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html – Jack

Antwort

39

Diese einfache C-Funktion:

dispatch_async(dispatch_get_main_queue(), { 

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

Was starten Sie Ihre Funktion mit:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     loadAlbums() 

}) 

in viewDidLoad()?

+0

Yup das funktioniert Ben –

+0

Gern geschehen. Bitte markieren Sie die Antwort als Ihre richtige Antwort, so dass andere Leute die Antwort sofort sehen :) – Ben

+0

Ich sprach zu früh - ich bekomme jetzt einen Fehler, den ich nicht einmal wissen kann, wie man debuggt: http://cl.ly/image/1d272E263V2N - bitte schauen Sie sich –

2

Verwenden Sie GCD anstelle von performSelector-Varianten.

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

Sie fordern PerformSelectorOnMainThread auf UIViewController statt UITableView Objekt

Kann Ihr Code sein:

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

Statt:

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

Sie bekommen diese Nachricht weil UIViewController d dem Namen „performSelectorOnMainThread“

1

// Xcode 8.2 // swift 3.0

ich eine API bin Zugriff oes't jede Methode haben, die die Daten in Bezug auf Wetter dh ‚Temperatur‘, ‚Feuchte‘, ‚Druck‘ usw. gibt nach dem Absenden des Namens oder der Postleitzahl einer Stadt. Diese Daten werden müssen, also gezeigt auf UI (Es muss auf Hauptthread sein) (die Tableview)

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

//

func DataOnUI() { 

    self.tblView.reloadData() 
} 

P. S. Startseite ist die Klasse der UIViewController

+0

Bitte beschreiben Sie Ihre Lösung in wenigen Worten. –

-1

Swift 3/Xcode 8.2

Hier ist ein Swift 3-Wege, Dinge zu tun. Geben Sie einfach die Zeit (in Sekunden) ein, nach der der Code ausgeführt werden soll.

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 
    } 

Alternativ können Sie einfach platzieren Sie Ihre Zeitverzögerung in einzeiligen Notation wie folgt:

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