2014-06-09 19 views
16

Tôi muốn tải lại dữ liệu bảng của tôi bên trong một khối trong phương pháp này:Swift thay thế cho 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 
    } 

Nhưng khối khác sẽ không thực thi. Lỗi tôi nhận được là:

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

Vậy thay thế cho 'performSelectorOnMainThread' là gì?

CẬP NHẬT:

Tôi hiện đang bị lỗi hủy bỏ. Đây là những gì giao diện điều khiển trông giống như: http://cl.ly/image/3D0h1x433P0R

+0

GCD đã được ưa thích hơn 'performSelectorOnMainThread' trong Objective -C trong một thời gian, hãy xem tài liệu tại đây: https: //developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html – Jack

Trả lời

39

này đơn giản C-chức năng:

dispatch_async(dispatch_get_main_queue(), { 

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

gì về ra mắt chức năng của bạn với:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     loadAlbums() 

}) 

trong viewDidLoad()?

+0

Yup hoạt động Ben –

+0

Bạn được chào đón. Vui lòng đánh dấu câu trả lời là câu trả lời đúng của bạn để người khác nhìn thấy câu trả lời ngay lập tức :) – Ben

+0

Tôi đã nói quá sớm - Tôi hiện đang gặp lỗi mà thậm chí tôi không biết cách gỡ lỗi: http://cl.ly/image/1d272E263V2N - xin hãy xem –

2

Sử dụng GCD thay cho performSelector biến thể.

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

Bạn đang kêu gọi performSelectorOnMainThread trên UIViewController thay vì đối tượng UITableView của

Có thể là mã của bạn:

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

Thay vì:

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

bạn đang nhận được thông điệp rằng vì UIViewController d oes't có bất kỳ phương thức có tên "performSelectorOnMainThread"

1

// Xcode 8.2 // nhanh chóng 3,0

tôi truy cập vào một API mang đến cho các dữ liệu liên quan đến thời tiết nghĩa là 'nhiệt', 'ẩm', 'ép' vv sau khi gửi tên hoặc mã bưu điện của bất kỳ thành phố nào. Vì vậy, đó nhu cầu dữ liệu được hiển thị (Nó phải nằm Chủ đề chính) trên giao diện người dùng (tableView)

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

//

func DataOnUI() { 

    self.tblView.reloadData() 
} 

T.B. Trang chủ là lớp của UIViewController

+0

Vui lòng mô tả giải pháp của bạn sau vài từ. –

-1

Swift 3/Xcode 8.2

Dưới đây là một cách Swift 3 làm việc. Chỉ cần chèn thời gian (tính bằng giây) mà bạn muốn mã thực thi sau đó.

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 
    } 

Hoặc bạn chỉ có thể đặt thời gian trễ theo cách ghi một dòng như vậy:

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

Swift 3

DispatchQueue.main.async(execute: 
{ 
    //Code to execute on main thread 
}) 
Các vấn đề liên quan