您的位置:首页 > 移动开发 > IOS开发

iOS多线程技术

2016-03-02 11:04 375 查看

1. NSObject多线程

[self
performSelectorInBackground:@selector(intoBackground)
withObject:nil];

[self
performSelectorOnMainThread:@selector(intoForword)
withObject:nil
waitUntilDone:YES];

2. NSThread多线程

创建子线程

1.[NSThread detachNewThreadSelector:@selector(intoBackThread:) toTarget:self withObject:imageView];

  2. NSThread *thread =[[NSThread
alloc]
initWithTarget:self
selector:@selector(intoBackThread:)
object:imageView];
        [thread
start];

在子线程中进行的操作需要autoreleasepool

@autoreleasepool{}

回到主线程

[imageView performSelectorOnMainThread:@selector(setImage:)
withObject:image waitUntilDone:YES];

3. NSOperation多线程

1.

//  利用队列设置同时并发的线程个数

    [self.queue
setMaxConcurrentOperationCount:4];

    
   
for (UIImageView *imageView
in self.dataArray) {
       
NSInvocationOperation *operation = [[NSInvocationOperation
alloc] initWithTarget:self
selector:@selector(operationCilck:)
object:imageView];

        // 
队列(一定要记住)
        [self.queue
addOperation:operation];  
    }

2.

@autoreleasepool {

    

        [self.queue
setMaxConcurrentOperationCount:4];

        
       
for (UIImageView *imageView
in self.dataArray) {

            
           
NSBlockOperation *blockOperation = [NSBlockOperation
blockOperationWithBlock:^{

                
                [NSThread
sleepForTimeInterval:1.0f];

                

    //         
在线程中作多线程加载资源

                UIImage *image = [UIImage
imageNamed:[NSString
stringWithFormat:@"NatGeo%02ld.png",(long)arc4random_uniform(17)
+ 1]];

                

    //         
得到UI线程

                [[NSOperationQueue
mainQueue] addOperationWithBlock:^{

            
                    [imageView
setImage:image];  
                }];
            }];

            
            [self.queue
addOperation:blockOperation];
        }
    }
}
在子线程中进行的操作需要autoreleasepool

回到主线程

[imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

4. GCD多线程

//  队列初始化(全局队列)

    dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);

//  同步:一步一步做 
异步:同时做
   
for (UIImageView *imageView
in self.dataArray) {

    // 
进入多线程
       
dispatch_async(queue, ^{

            
           
NSLog(@"%@",[NSThread
currentThread]);

            UIImage *image = [UIImage
imageNamed:[NSString
stringWithFormat:@"NatGeo%02ld.png",(long)arc4random_uniform(17)
+ 1]];

            

            dispatch_async(dispatch_get_main_queue(), ^{
                [imageView
setImage:image];  
            });
        });
    } 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: