我试图了解Objective-C的调度机制。但是没有成功。
我有这两种方法:
- (void)downloadImage
{
NSString * URLString= @"http://www.something.com";
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
NSURL *imageURL = [NSURL URLWithString:fullURL];
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
theImportant.image = [UIImage imageWithData:imageData];
dispatch_sync(dispatch_get_main_queue(), ^{
stopAnimate=true;
[self MoveToPosition:myView.center];
});
});
}
和
-(void)MoveToPosition:(CGPoint)position{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[UIView animateWithDuration:1.5
delay:0.0
options:UIViewAnimationOptionCurveEaseInOut |UIViewAnimationOptionBeginFromCurrentState
animations:^{
myView.center=position;
}
completion:^(BOOL finished){
if (stopAnimate){
//do Nothing
} else if (someFlag){
[self downloadImage];
}
}
];
}
因此,第一种方法由第二种方法调用,而第二种方法又调用第一种方法。
这样做很好,除了不显示 theImportant.image 的事实。
当我移动
时theImportant.image = [UIImage imageWithData:imageData];
中的
dispatch_sync
阻止 downloadImage ,动画开始以意想不到的方式运行。
我确实意识到我并不完全理解调度,但我希望你的见解会增长我的智慧。
theImportant定义为
@property(强,原子)IBOutlet UIImageView * theImportant;
我的问题很简单:为什么我的theImportant.image没有显示。
答案 0 :(得分:0)
我最后添加了
@property (strong, atomic) UIImage * theImportantImage;
到我的.h文件,将图像设置为,然后我做了
theImportantFace.image=theImportantImage.
不确定为什么会起作用,但嘿,确实如此。看来我的问题与异步的东西根本没有关系。可怜。不满意不知道是什么问题。
答案 1 :(得分:0)
dispatch_xxx ...方法不调用任何东西。他们获取一段代码并将其添加到队列中。就像你在一张纸上写了一些说明并把那张纸放在同事的桌子上一样。你的同事将完成他正在做的任何事情,当他完成后,他将完成写在纸上的内容。
有一个特殊队列,称为"全局队列"。如果你把一张纸放在"全球"桌子上有五十个同事,他们中的任何一个都可以随时拿起那张纸,这样就可以更快完成工作(因为很多人都在从事不同的工作),但你永远都不知道他们的工作顺序是什么完成。