Swift中替代performSelectorOnMainThread的方法

18

我想在这个方法中重新加载块内的表格数据:

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'的方法是什么?

更新:

我现在收到了一个中止错误。


现在在Objective-C中,GCD已经比performSelectorOnMainThread更受欢迎了一段时间,请查看此处的文档:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html - Jack
6个回答

41

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


不用谢。请将答案标记为正确答案,这样其他人就可以立即看到答案 :) - Ben
我说得太早了 - 我现在遇到一个错误,甚至不知道如何调试:http://cl.ly/image/1d272E263V2N - 请看一下。 - Amit Erandole
当异常发生时,您在控制台日志中看到了什么(异常只是意味着调用了abort())? - David Berry
我在自己的项目中尝试了这个,并查找了performOnThread方法,它们都已被弃用。 - Ben
1
我在tableview中的可调整大小的单元格遇到了问题,它的大小取决于是否有缩略图,在除iPhone 6 Plus之外的每个设备上都运行良好,但是在该设备上也完美运行!谢谢! - diegomen
显示剩余3条评论

5

Swift 3

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

2

使用GCD替代performSelector方法。

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

1
你正在UIViewController上调用performSelectorOnMainThread,而不是UITableView的对象。
可能是你的代码:
self.performSelectorOnMainThread(Selector(reloadData), withObject: self.tblMainTable, waitUntilDone: true)

改为:

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

您看到此消息是因为UIViewController没有名为"performSelectorOnMainThread"的方法。


1

//Xcode 8.2 // swift 3.0

我正在访问一个API,提交城市名称或邮政编码后,它会提供有关天气的数据,例如“温度”,“湿度”,“压力”等。 因此,这些数据需要显示在UI上(必须在主线程上),在表格视图(tableView)中。

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

//

func DataOnUI() {

     self.tblView.reloadData()
}

P.S. Home 是 UIViewController 的类


请在几句话中描述您的解决方案。 - Werner Henze

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接