gpt4 book ai didi

cocoa - 从另一个线程在主线程上运行方法

转载 作者:行者123 更新时间:2023-12-03 16:08:31 25 4
gpt4 key购买 nike

我的模型类必须从互联网获取一些数据。所以我决定在另一个线程上运行它,这样用户界面就不会卡住。因此,当一个对象需要一些数据时,它首先使用这种类型的方法询问模型:

- (void)giveMeSomeData:(id)object withLabel:(id)label {
objectAsking= object;
theLabel= label;
NSThread* thread= [[NSThread alloc] initWithTarget:self selector:@selector(getTheDataFromInternet) object:nil];
[thread start];
}

- (void)getTheDataFromInternet {
//getting data...

theData= [dataFromInternet retain]; //this is the data the object asked for
[self returnObjectToAsker];
}

- (void)returnObjectToAsker {
[objectAsking receiveData:theData withLabel:theLabel];
}

由于我还是个新手,你能告诉我这是否是一个好的模式?

谢谢!

最佳答案

您的设置非常正确。您永远不想在主线程上启动任何类型的网络连接。

就目前而言,-returnObjectToAsker 将在后台线程上执行。

您可能会对 -[NSObject performSelectorOnMainThread:withObject:waitUntilDone:] 感兴趣.

或者,如果您想使用 Grand Central Dispatch(iOS 4+、Mac OS X 10.6+)进行某些操作,您可以这样做:

#import <dispatch/dispatch.h>

- (void)giveMeSomeData:(id)object withLabel:(id)label {
dispatch_async(dispatch_get_global_queue(0,0), ^{
//this runs on a background thread
//get data from the internet
dataFromTheInternet = ...;
dispatch_async(dispatch_get_main_queue(), ^{
[object receiveData:dataFromTheInternet withLabel:label];
//this runs on the main thread. Use theData
});
});
}

由于 block 捕获了它们的环境,因此您甚至不必将 objectlabel 保存到 ivars 中。 :)

关于cocoa - 从另一个线程在主线程上运行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892182/

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