object-c怎么在线程中显示图片

翅膀又硬了 2014-11-11 11:48:51
如题,我新接触object-c,做一个类似远程控制的东西。现在是用的c++和object-c混合编程。线程中已经收到图片数据,不知道该如何显示?
下面是我线程里的代码
NSData *data = [NSData dataWithBytes: (unsigned char*)pwScreenBits length:nRealSize];
UIImage *MyImg = [[UIImage alloc] initWithData: data ];

该如何把MyImg 弄到主线程的 UIImageView *myImageView里面去显示?
...全文
153 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bannings 2014-11-11
  • 打赏
  • 举报
回复
image已经构造出来了,直接在1楼提供的GCD里取ImageView并给它赋值就好了: dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = MyImg; });
_nathanwu 2014-11-11
  • 打赏
  • 举报
回复
dispatch_async(dispatch_get_main_queue(), ^{ //do something in main_queue });
翅膀又硬了 2014-11-11
  • 打赏
  • 举报
回复
引用 10 楼 zhanglei5415 的回复:
[quote=引用 9 楼 yunchao630 的回复:] [quote=引用 7 楼 zhangao0086 的回复:] [quote=引用 4 楼 yunchao630 的回复:] [quote=引用 1 楼 u014630777 的回复:] dispatch_async(dispatch_get_main_queue(), ^{ //do something in main_queue });
引用 2 楼 zhangao0086 的回复:
image已经构造出来了,直接在1楼提供的GCD里取ImageView并给它赋值就好了: dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = MyImg; });
现在是这样我这里是这样的:UIImage *MyImg = [[UIImage alloc] initWithData: data ];在一个C语言写的全局的线程函数里面, 在main.stotryboard里面拖了一个UIImageview控件。然后按住control,用鼠标拖动到ViewController头文件, ViewController.h里面 @property (strong, nonatomic) IBOutlet UIImageView *MyImageView; 然后ViewController.m里面加上 @synthesize MyImageView; 然后在初始化的位置加上 MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 我想问dispatch_async(dispatch_get_main_queue(), ^{ MyImageView.image = MyImg; });该写在什么地方呀?如果是写在全局的线程函数的里面,MyImageView又不是全局的呀? [/quote] 有几个问题。 你的UIImageView是在Storyboard里拖出来的,那直接连到VC上就可以了,.m中的这些代码不要写: @synthesize MyImageView; MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 另外,你说的对,ImageView不是全局的,也没必要是全局的,但你的线程是全局的,你应该在全局线程构造完一个Image之后,发出一个通知,以Image对参数,然后在VC初始化的时候监听这个通知,VC释放的时候取消监听,当收到通知的时候直接把Image赋值给ImageView就行了,不需要使用GCD。 不过你的线程与VC应该也不是完全独立的吧?不然线程在走的时候,没有VC的话,你Image岂不是白构造了?[/quote]唉,你们说的我都明白什么意思。可是我总共自学里一周object-c,懂的太少了。最后问一句就结贴,您说的这个“通知”,我需要搜哪些资料学习?[/quote] 他说的“通知” 是NSNotificationCenter. 其实像这种请求网络图片的需求,使用异步的方式是必须的手段,当异步线程下载完后,再抛回到UI主线程去更新UI,这是通用的做法。其它的方式只会增加复杂度。[/quote]非常感谢
ReyZhang 2014-11-11
  • 打赏
  • 举报
回复
引用 9 楼 yunchao630 的回复:
[quote=引用 7 楼 zhangao0086 的回复:] [quote=引用 4 楼 yunchao630 的回复:] [quote=引用 1 楼 u014630777 的回复:] dispatch_async(dispatch_get_main_queue(), ^{ //do something in main_queue });
引用 2 楼 zhangao0086 的回复:
image已经构造出来了,直接在1楼提供的GCD里取ImageView并给它赋值就好了: dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = MyImg; });
现在是这样我这里是这样的:UIImage *MyImg = [[UIImage alloc] initWithData: data ];在一个C语言写的全局的线程函数里面, 在main.stotryboard里面拖了一个UIImageview控件。然后按住control,用鼠标拖动到ViewController头文件, ViewController.h里面 @property (strong, nonatomic) IBOutlet UIImageView *MyImageView; 然后ViewController.m里面加上 @synthesize MyImageView; 然后在初始化的位置加上 MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 我想问dispatch_async(dispatch_get_main_queue(), ^{ MyImageView.image = MyImg; });该写在什么地方呀?如果是写在全局的线程函数的里面,MyImageView又不是全局的呀? [/quote] 有几个问题。 你的UIImageView是在Storyboard里拖出来的,那直接连到VC上就可以了,.m中的这些代码不要写: @synthesize MyImageView; MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 另外,你说的对,ImageView不是全局的,也没必要是全局的,但你的线程是全局的,你应该在全局线程构造完一个Image之后,发出一个通知,以Image对参数,然后在VC初始化的时候监听这个通知,VC释放的时候取消监听,当收到通知的时候直接把Image赋值给ImageView就行了,不需要使用GCD。 不过你的线程与VC应该也不是完全独立的吧?不然线程在走的时候,没有VC的话,你Image岂不是白构造了?[/quote]唉,你们说的我都明白什么意思。可是我总共自学里一周object-c,懂的太少了。最后问一句就结贴,您说的这个“通知”,我需要搜哪些资料学习?[/quote] 他说的“通知” 是NSNotificationCenter. 其实像这种请求网络图片的需求,使用异步的方式是必须的手段,当异步线程下载完后,再抛回到UI主线程去更新UI,这是通用的做法。其它的方式只会增加复杂度。
翅膀又硬了 2014-11-11
  • 打赏
  • 举报
回复
引用 7 楼 zhangao0086 的回复:
[quote=引用 4 楼 yunchao630 的回复:] [quote=引用 1 楼 u014630777 的回复:] dispatch_async(dispatch_get_main_queue(), ^{ //do something in main_queue });
引用 2 楼 zhangao0086 的回复:
image已经构造出来了,直接在1楼提供的GCD里取ImageView并给它赋值就好了: dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = MyImg; });
现在是这样我这里是这样的:UIImage *MyImg = [[UIImage alloc] initWithData: data ];在一个C语言写的全局的线程函数里面, 在main.stotryboard里面拖了一个UIImageview控件。然后按住control,用鼠标拖动到ViewController头文件, ViewController.h里面 @property (strong, nonatomic) IBOutlet UIImageView *MyImageView; 然后ViewController.m里面加上 @synthesize MyImageView; 然后在初始化的位置加上 MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 我想问dispatch_async(dispatch_get_main_queue(), ^{ MyImageView.image = MyImg; });该写在什么地方呀?如果是写在全局的线程函数的里面,MyImageView又不是全局的呀? [/quote] 有几个问题。 你的UIImageView是在Storyboard里拖出来的,那直接连到VC上就可以了,.m中的这些代码不要写: @synthesize MyImageView; MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 另外,你说的对,ImageView不是全局的,也没必要是全局的,但你的线程是全局的,你应该在全局线程构造完一个Image之后,发出一个通知,以Image对参数,然后在VC初始化的时候监听这个通知,VC释放的时候取消监听,当收到通知的时候直接把Image赋值给ImageView就行了,不需要使用GCD。 不过你的线程与VC应该也不是完全独立的吧?不然线程在走的时候,没有VC的话,你Image岂不是白构造了?[/quote]唉,你们说的我都明白什么意思。可是我总共自学里一周object-c,懂的太少了。最后问一句就结贴,您说的这个“通知”,我需要搜哪些资料学习?
ReyZhang 2014-11-11
  • 打赏
  • 举报
回复
引用 4 楼 yunchao630 的回复:
[quote=引用 1 楼 u014630777 的回复:] dispatch_async(dispatch_get_main_queue(), ^{ //do something in main_queue });
引用 2 楼 zhangao0086 的回复:
image已经构造出来了,直接在1楼提供的GCD里取ImageView并给它赋值就好了: dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = MyImg; });
现在是这样我这里是这样的:UIImage *MyImg = [[UIImage alloc] initWithData: data ];在一个C语言写的全局的线程函数里面, 在main.stotryboard里面拖了一个UIImageview控件。然后按住control,用鼠标拖动到ViewController头文件, ViewController.h里面 @property (strong, nonatomic) IBOutlet UIImageView *MyImageView; 然后ViewController.m里面加上 @synthesize MyImageView; 然后在初始化的位置加上 MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 我想问dispatch_async(dispatch_get_main_queue(), ^{ MyImageView.image = MyImg; });该写在什么地方呀?如果是写在全局的线程函数的里面,MyImageView又不是全局的呀? [/quote] 你在storyboard中将UIImageView设置成了插座(IBOutlet)变量,那么就不需要再在代码中来实例化了。
  MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame];
 MyImageView.center = self.view.center;
 [self.view addSubview:MyImageView];
上面的代码删除掉 在viewDidload中视图的元素被渲染到屏幕中时,开启 一个异步线程来下载图片
-(void)viewDidLoad {
      [super viewDidLoad];
      ///////异步请求
      NSString *pic_str =  @"xxxxxxxx";  //////你的图片地址
      NSURL * pic_url = [NSURL urlWithString:pic_str];
      NSURLRequest *pic_request = [NSURLRequest requestWithURL:pic_url];
     ///////发送异步请求
     [NSURLConnection sendAsynchronousRequest:pic_request 
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse*urlResponce,NSData*data,NSError*error)  {
                ////////回到UI线程更新
                dispatch_async(dispatch_get_main_queue(), ^{
                                  MyImg  = [[UIImage alloc] initWithData: data ];
                                  imageView.image = MyImg;
                 });
     }
}
Bannings 2014-11-11
  • 打赏
  • 举报
回复
引用 4 楼 yunchao630 的回复:
[quote=引用 1 楼 u014630777 的回复:] dispatch_async(dispatch_get_main_queue(), ^{ //do something in main_queue });
引用 2 楼 zhangao0086 的回复:
image已经构造出来了,直接在1楼提供的GCD里取ImageView并给它赋值就好了: dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = MyImg; });
现在是这样我这里是这样的:UIImage *MyImg = [[UIImage alloc] initWithData: data ];在一个C语言写的全局的线程函数里面, 在main.stotryboard里面拖了一个UIImageview控件。然后按住control,用鼠标拖动到ViewController头文件, ViewController.h里面 @property (strong, nonatomic) IBOutlet UIImageView *MyImageView; 然后ViewController.m里面加上 @synthesize MyImageView; 然后在初始化的位置加上 MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 我想问dispatch_async(dispatch_get_main_queue(), ^{ MyImageView.image = MyImg; });该写在什么地方呀?如果是写在全局的线程函数的里面,MyImageView又不是全局的呀? [/quote] 有几个问题。 你的UIImageView是在Storyboard里拖出来的,那直接连到VC上就可以了,.m中的这些代码不要写: @synthesize MyImageView; MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 另外,你说的对,ImageView不是全局的,也没必要是全局的,但你的线程是全局的,你应该在全局线程构造完一个Image之后,发出一个通知,以Image对参数,然后在VC初始化的时候监听这个通知,VC释放的时候取消监听,当收到通知的时候直接把Image赋值给ImageView就行了,不需要使用GCD。 不过你的线程与VC应该也不是完全独立的吧?不然线程在走的时候,没有VC的话,你Image岂不是白构造了?
翅膀又硬了 2014-11-11
  • 打赏
  • 举报
回复
引用 3 楼 z8323664 的回复:
也可以[myImageView perforSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntiDone:NO]; 然后重写imageView的drawInRect , 在这函数里画
多谢,我学习一下试试
yhryyq 2014-11-11
  • 打赏
  • 举报
回复
改成全局的 或者传进去
翅膀又硬了 2014-11-11
  • 打赏
  • 举报
回复
引用 1 楼 u014630777 的回复:
dispatch_async(dispatch_get_main_queue(), ^{ //do something in main_queue });
引用 2 楼 zhangao0086 的回复:
image已经构造出来了,直接在1楼提供的GCD里取ImageView并给它赋值就好了: dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = MyImg; });
现在是这样我这里是这样的:UIImage *MyImg = [[UIImage alloc] initWithData: data ];在一个C语言写的全局的线程函数里面, 在main.stotryboard里面拖了一个UIImageview控件。然后按住control,用鼠标拖动到ViewController头文件, ViewController.h里面 @property (strong, nonatomic) IBOutlet UIImageView *MyImageView; 然后ViewController.m里面加上 @synthesize MyImageView; 然后在初始化的位置加上 MyImageView = [[UIImageView alloc] initWithFrame:self.view.frame]; MyImageView.center = self.view.center; [self.view addSubview:MyImageView]; 我想问dispatch_async(dispatch_get_main_queue(), ^{ MyImageView.image = MyImg; });该写在什么地方呀?如果是写在全局的线程函数的里面,MyImageView又不是全局的呀?
z8323664 2014-11-11
  • 打赏
  • 举报
回复
也可以[myImageView perforSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntiDone:NO]; 然后重写imageView的drawInRect , 在这函数里画

29,030

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧