IOS多線程編程N(yùn)SThread的使用方法
IOS多線程編程N(yùn)SThread的使用方法
NSThread是多線程的一種,有兩種方法創(chuàng)建子線程
(1)優(yōu)點(diǎn):NSThread 比GCD、NSOperation都輕量級(jí)
(2)缺點(diǎn):需要自己管理線程的生命周期,線程同步。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開銷
第一種是隱藏創(chuàng)建,有以下幾種方式:
(1)多用于串行:- (id)performSelector:(SEL)aSelector withObject:(id)object;
(2)后臺(tái)執(zhí)行,多用于并行:- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
(3)延遲執(zhí)行:- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
(4)回到主線程執(zhí)行:- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
注意:
(1)通過方法" + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument; ",或"+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget"停止執(zhí)行;
示例:
//創(chuàng)建子線程-隱式方法
// 子線程-串行 [self performSelector:@selector(showCount:) withObject:@(11)]; [self performSelector:@selector(showCount:) withObject:@(12)]; [self performSelector:@selector(showCount:) withObject:@(23)];
// 子線程-并行(后臺(tái)) [self performSelectorInBackground:@selector(showCount:) withObject:@(41)]; [self performSelectorInBackground:@selector(showCount:) withObject:@(42)];
// 回到主線程 [self performSelectorOnMainThread:@selector(showCount:) withObject:@(51) waitUntilDone:YES];
// 子線程延遲執(zhí)行 [self performSelector:@selector(showCount:) withObject:@(61) afterDelay:5.0];
// 停止 [NSObject cancelPreviousPerformRequestsWithTarget:self];
第二種是顯示創(chuàng)建,方式如下:
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
注意:
(1)通過方法" - (void)start; "開始執(zhí)行;
(2)通過方法" - (void)cancel; "停止執(zhí)行;
示例:
//創(chuàng)建子線程-顯示方法
self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(showCount:) object:@(61)]; self.thread.name = @"計(jì)數(shù)"; [self.thread start]; [self.thread cancel];
代碼示例
- (void)showCount:(NSNumber *)number
{
NSInteger count = arc4random() % 1000;
count = 1000;
for (int i = 0; i < count; i++)
{
NSLog(@"第 %@ 個(gè) i = %@", number, @(i));
// 休眠n秒再執(zhí)行
[NSThread sleepForTimeInterval:0.2];
// 停止
// BOOL isStop = [self.thread isCancelled];
// if (isStop)
// {
// NSLog(@"2 停止");
// break;
// }
if (isCancelThread)
{
NSLog(@"2 停止");
break;
}
}
}
bool isCancelThread = NO;
- (void)stopClick
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
if (self.thread)
{
BOOL isExecuting = [self.thread isExecuting];
if (isExecuting)
{
NSLog(@"1 停止");
// [self.thread cancel];
isCancelThread = YES;
}
}
}
- (void)downloadImage:(NSString *)imageUrl
{
NSURL *url = [NSURL URLWithString:imageUrl];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
UIImage *image = [[UIImage alloc] initWithData:data];
if (image == nil)
{
}
else
{
// [self performSelectorOnMainThread:@selector(updateImage:) withObject:image waitUntilDone:YES];
[self performSelectorInBackground:@selector(updateImage:) withObject:image];
}
// NSURL *url = [NSURL URLWithString:imageUrl];
// NSURLRequest *request = [NSURLRequest requestWithURL:url];
// NSURLSession *session = [NSURLSession sharedSession];
// NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
//
// // 輸出返回的狀態(tài)碼,請(qǐng)求成功的話為200
// NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
// NSInteger responseStatusCode = [httpResponse statusCode];
// NSLog(@"%ld", responseStatusCode);
//
// UIImage *image = [UIImage imageWithData:data];
//// [self performSelectorOnMainThread:@selector(updateImage:) withObject:image waitUntilDone:YES];
// [self performSelectorInBackground:@selector(updateImage:) withObject:image];
// }];
//
// // 使用resume方法啟動(dòng)任務(wù)
// [dataTask resume];
}
- (void)updateImage:(UIImage *)image
{
self.imageview.image = image;
// self.imageview = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, (CGRectGetWidth(self.view.bounds) - 10.0 * 2), (CGRectGetWidth(self.view.bounds) - 10.0 * 2))];
// [self.view addSubview:self.imageview];
// self.imageview.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.2];
//
// self.imageview.image = image;
}
NSString *imageUrl = @"http://ww1.sinaimg.cn/crop.0.0.1242.1242.1024/763fb12bjw8empveq3eq8j20yi0yiwhw.jpg"; // 隱藏創(chuàng)建 // [self performSelectorInBackground:@selector(downloadImage:) withObject:imageUrl]; [self performSelectorOnMainThread:@selector(downloadImage:) withObject:imageUrl waitUntilDone:YES]; // 創(chuàng)建子線程-顯示方法 self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(downloadImage:) object:imageUrl]; self.thread.name = @"imageDownload"; [self.thread start];

如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
iOS使用UIScorllView實(shí)現(xiàn)兩指縮放功能
兩指縮放功能不僅可以用UIPinchGestureRecognizer手勢(shì)來實(shí)現(xiàn),還能用UIScorllView來實(shí)現(xiàn),UIScrollView可以輕松的實(shí)現(xiàn)最大與最小縮放值,以及滾動(dòng)的效果,效果非常棒,具體實(shí)例代碼大家參考下本文吧2017-03-03
iOS開發(fā)學(xué)習(xí)TableView展現(xiàn)一個(gè)list實(shí)例
這篇文章主要為大家介紹了iOS系列學(xué)習(xí)TableView展現(xiàn)一個(gè)list實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別詳解
OS的人臉識(shí)別從iOS 5(2011)就有了,不過一直沒怎么被關(guān)注過。人臉識(shí)別API允許開發(fā)者不僅可以檢測(cè)人臉,也可以檢測(cè)到面部的一些特殊屬性,比如說微笑或眨眼。下面這篇文章主要給大家介紹了iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別的相關(guān)資料,需要的朋友可以參考下。2017-05-05

