2014-06-09 12 views
16

Chcę przeładować moich danych tabel wewnątrz bloku w tej metodzie:Swift alternatywą 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 
    } 

Ale blok jeszcze nie wykona. Błąd pojawia się:

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

Więc co jest alternatywą dla 'performSelectorOnMainThread' w Swift?

AKTUALIZACJA:

Otrzymuję teraz błąd przerwania. Oto co konsola wygląda następująco: http://cl.ly/image/3D0h1x433P0R

+0

GCD został preferowane przez 'performSelectorOnMainThread' w Celu -C od jakiegoś czasu, sprawdź dokumenty tutaj: https: //developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html – Jack

Odpowiedz

39

ten prosty C-funkcji:

dispatch_async(dispatch_get_main_queue(), { 

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

Co o uruchomienie swoją funkcję z:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     loadAlbums() 

}) 

w viewDidLoad()?

+0

Tak działa Ben –

+0

Nie ma za co. Proszę oznaczyć odpowiedź jako poprawną odpowiedź, aby inne osoby od razu widziały odpowiedź :) – Ben

+0

Za wcześnie rozmawiałem - teraz dostaję błąd, że nawet nie wiem jak debugować: http://cl.ly/image/1d272E263V2N - proszę spojrzeć –

2

Użyj GCD zamiast odmian performSelector.

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

Telefonujesz performSelectorOnMainThread na UIViewController zamiast obiektu UITableView za

Może być Twój kod:

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

Zamiast:

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

otrzymujesz tę wiadomość ponieważ UIViewController d oes't mieć dowolną metodę o nazwie "performSelectorOnMainThread"

1

// Xcode 8.2 // Swift 3.0

mam dostępu do API, który daje dane dotyczące pogody IE temperatury ", 'wilgotność', 'ciśnienie' etc po przesłaniu nazwy lub kodu pocztowego dowolnego miasta. Tak, to potrzeba dane mają być wyświetlane (To musi być na głównym wątku) na interfejsie (tableview)

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

//

func DataOnUI() { 

    self.tblView.reloadData() 
} 

PS: Dom jest klasa UIViewController

+0

Proszę opisać swoje rozwiązanie w kilku słowach. –

-1

Swift 3/Xcode 8.2

Oto Swift 3 sposób robienia rzeczy. Po prostu wstaw czas (w sekundach), po którym kod ma zostać wykonany.

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 
    } 

Ewentualnie można po prostu umieścić opóźnienie w notacji jednej linii tak:

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 
}) 
Powiązane problemy