Swift替代performSelectorOnMainThread

时间:2014-06-09 18:12:47

标签: swift performselector ios8

我想在此方法中将块数据重新加载到块中:

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

那么swift中'performSelectorOnMainThread'的替代方法是什么?

更新:

我现在遇到了中止错误。

6 个答案:

答案 0 :(得分:40)

这个简单的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()?

答案 1 :(得分:3)

Swift 3

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

答案 2 :(得分:2)

使用GCD代替performSelector变体。

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

答案 3 :(得分:1)

您在UIViewController上调用 performSelectorOnMainThread 而不是UITableView的对象

可能是您的代码:

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

而不是:

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

您收到该消息是因为UIViewController没有任何名为“performSelectorOnMainThread”的方法

答案 4 :(得分:1)

// Xcode 8.2 // swift 3.0

我正在访问API,该API提供有关天气的数据,即温度,湿度,压力等。提交任何城市的名称或邮政编码后等。 因此,需要在UI上显示该数据(必须在主线程上)( tableView

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

//

func DataOnUI() {

     self.tblView.reloadData()
}

P.S。 Home是UIViewController的类

答案 5 :(得分:-1)

Swift 3 / Xcode 8.2

这是Swift 3的做事方式。只需插入您希望代码执行的时间(以秒为单位)。

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
    }

或者你可以简单地将时间延迟放在一行符号中:

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