IOS多线程_NSThread和NSInvocationOperation

来源:互联网 发布:sshd 知乎 编辑:程序博客网 时间:2024/05/16 23:40

//虽然现在在多线程方面大多都在用GCD,当其他方式我们还是应该有所了解,给大家介绍一下NSThread和NSInvocationOperation的简单用法


@interfaceyxpViewController ()

{

   UIImageView *_imageView;

    

    //声明一个队列

   NSOperationQueue *_operationQueue;

}


@end


@implementation yxpViewController


- (void)viewDidLoad

{

    [superviewDidLoad];

    //初始化操作队列

    _operationQueue = [[NSOperationQueuealloc]init];

    

     //在这里限定了该队列只同时运行一个线程

    [_operationQueuesetMaxConcurrentOperationCount:1];

    

    //初始化一_ImageView

    _imageView=[[UIImageViewalloc]initWithFrame:CGRectMake(10,70,300, 450)];

    _imageView.backgroundColor=[UIColorgrayColor];

    _imageView.animationDuration=3.0;

    _imageView.animationRepeatCount=0;

    [self.viewaddSubview:_imageView];

    

    //下面两种方法添加一个线程

    //第一种

    

    //创建一个NSInvocationOperation对象,并初始化到方法

    //在这里,selector参数后的值是你想在另外一个线程中运行的方法(函数,Method)

    //在这里,object后的值是想传递给前面方法的数据

   NSInvocationOperation* theOp = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(addTaskMethod:)object:_imageView];

    

    //当然也可以选择直接调用start方法开始,不过这个样做是同步的,也就是说还是要等后台线程执行完成才执行主线程

    //[theOp start];

    

    // Operation加入到队列中 是theOp和主线程同时执行,也就是异步线程,这样才能达到我们的效果

    [_operationQueueaddOperation:theOp];

    

    //第二种

    //用[NSThread detachNewThreadSelector:@selector(addTaskMethod:) toTarget:self withObject:nil]; 也可以增加一个线程 等效于上一种

    //[NSThread detachNewThreadSelector:@selector(addTaskMethod:) toTarget:self withObject:nil];


}

// 运行另外一个线程的方法

- (void)addTaskMethod:(id)data

{

    NSString *url1=@"http://h.hiphotos.baidu.com/image/w%3D230/sign=b2d5c289123853438ccf8022a311b01f/91ef76c6a7efce1b1ae9f92fad51f3deb58f6510.jpg";

    NSString *url2=@"http://h.hiphotos.baidu.com/image/pic/item/d058ccbf6c81800aae834e8bb33533fa838b47d5.jpg";

    NSString *url3=@"http://d.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494eec3ba65132ff5e0fe99257e1b.jpg";

    NSString *url4=@"http://g.hiphotos.baidu.com/image/pic/item/a6efce1b9d16fdfa81f4ace4b68f8c5494ee7b1b.jpg";

    NSString *url5=@"http://g.hiphotos.baidu.com/image/pic/item/d6ca7bcb0a46f21f70031fdbf4246b600c33ae07.jpg";

    

    

   NSArray *array=[[NSArrayalloc]initWithObjects:url1,url2,url3,url4,url5,nil];

    

    NSMutableArray *imageArray=[[NSMutableArrayalloc]initWithCapacity:20];

   for (NSString *stringin array) {

       UIImage *image=[selfgetImageFromURL:string];

        [imageArrayaddObject:image];

    }

    

   _imageView.animationImages=imageArray;

    

    //回到主线程调用 在非线程中不能调用有关UI线程(主线程)的方法的,你可以直接调用一下看是否有效

    [selfperformSelectorOnMainThread:@selector(startImageViewAnimating)withObject:nilwaitUntilDone:YES];

}

- (void)startImageViewAnimating

{

    [_imageView startAnimating];

}

//下载图片的方法

-(UIImage *) getImageFromURL:(NSString *)fileURL {

    NSLog(@"执行图片下载函数");

   UIImage * result;

    NSData * data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:fileURL]];

    result = [UIImageimageWithData:data];

   return result;

}


- (void)didReceiveMemoryWarning

{

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


0 0
原创粉丝点击