2014-06-09 100 views
16

我要重新加載在這個方法塊在我的表中的數據:斯威夫特替代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?

更新:

我現在得到一箇中止錯誤。這裏是控制檯的樣子:http://cl.ly/image/3D0h1x433P0R

+0

GCD已經優於'performSelectorOnMainThread'的目的-C一段時間後,請查看此處的文檔:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html – Jack

回答

39

這個簡單的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中()?

+0

是的,這工作本 –

+0

不客氣。請將答案標記爲正確的答案,以便其他人立即看到答案:) – Ben

+0

我說得太快了 - 現在我收到一個錯誤,我甚至不知道如何調試:http://cl.ly/image/1d272E263V2N - 請看看 –

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 d oes't有一個名爲「performSelectorOnMainThread」

1

// Xcode的8.2 //迅速3.0

我訪問的API其給出關於天氣即「溫度」,「溼度」的數據,「壓力」等的任何方法提交任何城市的名稱或郵政編碼後。 因此,必須證明數據的需要(它必須是在主線程)在UI(中的tableView

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

//

func DataOnUI() { 

    self.tblView.reloadData() 
} 

附:家庭是類的UIViewController

+0

也請用幾句話描述您的解決方案。 –

-1

斯威夫特3/Xcode的8.2

這裏是一個做事的斯威夫特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 
} 
1

斯威夫特3

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