web-dev-qa-db-ja.com

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

しかし、elseブロックは実行されません。私が得るエラーは:

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

では、'performSelectorOnMainThread'に代わるものは何ですか?

更新:

現在、アボートエラーが発生しています。

18
Amit Erandole

この単純なC関数:

dispatch_async(dispatch_get_main_queue(), {

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

関数を起動するのはどうですか?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

        loadAlbums()

})

viewDidLoad()?

41
Ben

Swift

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

PerformSelectorのバリエーションの代わりにGCDを使用します。

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

UITableViewのオブジェクトではなくUIViewControllerでperformSelectorOnMainThreadを呼び出している

あなたのコードかもしれません:

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

の代わりに:

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

uIViewControllerには「performSelectorOnMainThread」という名前のメソッドがないため、このメッセージが表示されます

1
Anand Suthar

// Xcode 8.2 // Swift 3.0

任意の都市の名前または郵便番号を送信した後、天気に関するデータ(「気温」、「湿度」、「気圧」など)を提供するAPIにアクセスしています。したがって、そのデータはUIに表示される必要があります(メインスレッドにある必要があります)UI(the tableView

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

//

func DataOnUI() {

     self.tblView.reloadData()
}

追伸ホームはUIViewControllerのクラスです

1
Pankaj Nigam