http://www.41443.com/HTML/iphone/20150126/300050.html
iOS 中performSelectorOnMainThread 参数 waitUntilDone 很多说这个参数在主线程无效,这样的说法是错误的,当这个参数为YES,时表示当前runloop循环中的时间马上响应这个事件,如果为NO则runloop会将这个事件加入runloop队列在合适的时间执行这个事件。
可以通过block的同步和异步执行方式来观察这个参数;具体代码如下:
可以看出为YES时马上执行,为NO时先加入主线程的runloop事件循环里面,等待runloop来调度执行。
- (void)viewDidLoad {
[super viewDidLoad];
// NSTextAttachment
_label = [[UILabel alloc] initWithFrame:CGRectMake(100, 200, 200, 50)];
[self.view addSubview:_label];
NSTextAttachment *attach = [[NSTextAttachment alloc] init];
attach.image = [UIImage imageNamed:@"d_chanzui"];
attach.bounds = CGRectMake(0, -3, 15, 15);
NSMutableAttributedString *emotionStr = [[NSAttributedString attributedStringWithAttachment:attach] mutableCopy];
NSAttributedString *attributeStr = [[NSAttributedString alloc] initWithString:@"jjjjj"];
[emotionStr appendAttributedString:attributeStr];
_label.attributedText = emotionStr;
NSMutableDictionary *textAttrs = [NSMutableDictionary dictionary];
textAttrs[NSForegroundColorAttributeName] = [UIColor redColor];
textAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:40];
[emotionStr addAttributes:textAttrs range:NSMakeRange(0, emotionStr.length)];
_label.attributedText = emotionStr;
NSAttributedString *dictString = [[NSAttributedString alloc] initWithString:@"sdfsdf" attributes:textAttrs];
_label.attributedText = dictString;
// _label.attributedText = textAttrs;
array = @[@"123", @"32", @"56", @"78"];
array = [array sortedArrayUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) {
// {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
BOOL isBig = str1.integerValue < str2.integerValue;
if (isBig) {
return NSOrderedDescending;
}
return NSOrderedAscending; //NSOrderedAscending NSOrderedDescending
}];
NSLog(@"the array is %@", array);
//
// array sor
//同步执行的block
[self blockTest:^(int var) {
for (int i = 0; i < 9; i++) {
NSLog(@"b");
}
NSLog(@"var is %d", var);
}];
NSLog(@"sdfsdf");
// //异步执行的block
// [self asyncBlockTest:^(int var) {
//
// for (int i = 0; i < 90; i++) {
// NSLog(@"b");
// }
//
// NSLog(@"async var is %d", var);
//
// }];
//
// NSLog(@"sdfsdf");
}
//typedef <#returnType#>(^<#name#>)(<#arguments#>);
- (void)blockTest:( void (^)(int) )myBlock{
//同步执行
// myBlock(12);
//异步执行的block
// dispatch_async(dispatch_get_main_queue(), ^{
// myBlock(12);
// });
[self performSelectorOnMainThread:@selector(asyncBlockAction:) withObject:myBlock waitUntilDone:NO];
}
- (void)asyncBlockAction :( void (^)(int) )myBlock {
myBlock(122);
}
– (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 参数 Parameters arg wait 讨论 Discussion 你可以使用本方法向主线程发送消息. 主线程包含应用程序的主循环(这是NSApplication接收事件的地方). 在这种情况下, 消息相当于是你想要在线程上执行的当前对象的方法. 本方法使用Common模式将消息加入到主线程运行循环(run loop)队列, 即 与NSRunLoopCommonModes常数相关的模式。作为其正常运行循环处理的一部分,主线程从队列中取出消息(假设它是在Common模式中运行)并调用所需的方法。在同一个线程多次调用此方法会导致相应的选择进行排队,再按相同的顺序取出执行。 你不能取消由本方法加入队列的消息. 如果你想取消当前线程的一条消息, 必须使用 特别注意事项 (责任编辑:幽灵学院) |
今天的文章iOS: performSelectorOnMainThread waitUntilDone 参数详解分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24386.html