Быстрая альтернатива 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'
в swift?
UPDATE:
Теперь я получаю ошибку прерывания. Вот как выглядит консоль: http://cl.ly/image/3D0h1x433P0R
Ответы
Ответ 1
Эта простая 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()
})
in viewDidLoad()?
Ответ 2
Используйте GCD вместо вариантов исполнения.
dispatch_async(dispatch_get_main_queue()) {
() -> Void in
self.doSomething()
}
Ответ 3
Вы вызываете выполнитьSelectorOnMainThread на UIViewController вместо объекта UITableView
Может быть ваш код:
self.performSelectorOnMainThread(Selector(reloadData), withObject: self.tblMainTable, waitUntilDone: true)
Вместо:
self.tblMainTable.performSelectorOnMainThread(Selector("reloadData"), withObject: nil, waitUntilDone: true)
вы получаете это сообщение, потому что у UIViewController нет никакого метода с именем "performSelectorOnMainThread"
Ответ 4
//Xcode 8.2//swift 3.0
Я получаю доступ к API, который дает данные о погоде: температура, влажность, давление и т.д. после отправки имени или почтового индекса любого города.
Итак, эти данные должны быть показаны (это должно быть на главной теме) в пользовательском интерфейсе (tableView)
self.performSelector(onMainThread: #selector(Home.DataOnUI), with: nil, waitUntilDone: true)
//
func DataOnUI() {
self.tblView.reloadData()
}
P.S. Главная - это класс UIViewController
Ответ 5
Swift 3
DispatchQueue.main.async(execute:
{
//Code to execute on main thread
})
Ответ 6
Swift 3/Xcode 8.2
Вот быстрый способ сделать вещи. Просто вставьте время (в секундах), которое вы хотели бы выполнить код после.
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
}