作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的模型类必须从互联网获取一些数据。所以我决定在另一个线程上运行它,这样用户界面就不会卡住。因此,当一个对象需要一些数据时,它首先使用这种类型的方法询问模型:
- (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 捕获了它们的环境,因此您甚至不必将 object
和 label
保存到 ivars 中。 :)
关于cocoa - 从另一个线程在主线程上运行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892182/
我是一名优秀的程序员,十分优秀!