gpt4 book ai didi

ios - 在主线程上运行闭包

转载 作者:行者123 更新时间:2023-11-30 13:10:46 24 4
gpt4 key购买 nike

我创建了一个类,使开发人员更容易实现选择器 View 。在 UIPickerView 数据源方法中,我从闭包返回值。示例:

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerNumberOfRows!(component: component)
}

我对所有数据源方法使用相同的东西。当我运行该应用程序时,它在屏幕上显示选择器,但没有数据。问题是我正在从闭包接收数据,而这些数据又不在主线程上运行。

有没有办法在主线程上运行该闭包并确保它返回适合数据源函数返回值类型的值? (例如,在上面的示例中,闭包将返回一个 Int)

编辑:

我知道使用dispatch_async。但是,就我而言,这对我没有帮助。假设我创建了一个在主线程上运行闭包的函数,并且需要返回值,它看起来像这样:

func closureOnMainThread()->Int{
dispatch_async(dispatch_get_main_queue()) {
// Run your code here
return self.pickerNumberOfRows!(component: 0)
}
return 0
}

但是,上面的函数存在一个问题,即在调度 block 内返回值之前返回 0。

编辑 2:为了把事情说清楚。我的代码包含选择器的自定义类和实现它的 UIViewController:

class CustomPickerView: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {

var pickerNumberOfRows: ((component: Int)->Int)?

//MARK: UIPickerViewDatasource Methods
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerNumberOfRows!(component: component)
}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return pickerNumberOfComponents!()
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {print("Hello")
return pickerRowTitle!(forRow: row, inComponent: component)
}

//MARK: UIPickerViewDelegate Methods
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
pickerDidSelect!(row: row, component: component)
}
}

UIViewController( View 已加载):

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

let picker = CustomPickerView(parent: self)

picker.pickerNumberOfRows = { component in
return 10
}
}

请注意,我删除了中间的一些辅助函数,以便您专注于主要代码部分。

开发者可以在闭包变量中传入他想要的逻辑。

最佳答案

希望我现在能理解。在此 block 中您可以运行任何代码,它将在主线程上执行。

dispatch_async(dispatch_get_main_queue()) { 
// Run your code here
}

您可以运行它来了解您是否在主线程上:

NSThread.isMainThread()

编辑

您正在寻找的是返回同步响应:->int

您应该返回一个 block ,异步响应:

func someLongProcessTaskAndReturnCompenents(completion: (components: Int)->Void){

//Here you can do your long process task on back thread...
dispatch_async(dispatch_get_main_queue()) {

completion(self.pickerNumberOfRows!(component: 0))
}
}

现在,当您运行它时,响应将返回同步:

someLongProcessTaskAndReturnCompenents { (components) in
//Your logic after response
}

关于ios - 在主线程上运行闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38762919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com