8線程程序間的通信

原子核非原子屬性的選擇

OC在定義屬性時有nonatomic和atomic兩種

atomic:原子屬性,為setter方法加鎖(默認就是atomic)

nonatomic:非原子屬性,不會為setter方法加鎖

nonatomic和atomic對比

atomic:線程安全,需要消耗大量的資源

nonatomic:非線性安全,適合內存小的移動設備

iOS開發建議

所有屬性都聲明為nonatomic

盡量避免多線程搶奪同一塊資源

盡量將加鎖/資源搶奪的業務邏輯交給服務器端處理,減小移動客戶端的壓力

線程間通信

什么叫做線程間通信

在1個進程中,線程往往不是孤立存在的,多個線程之間需要進行通信

1個線程傳遞數據給另1個線程

在1個線程中執行完特定任務后,轉到另外一個線程中繼續執行

線程間通信實例-圖片線程


聲明屬性

在storyBoard拖UIImageView并關聯屬性

@property (weak,nonatomic) IBOulet UIImageView *imageView;

//在主線程下載圖片計算下載圖片消耗時間

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

//圖片的網絡路徑

NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

//下載開始時間

NSDate *begin = [NSDate date];

//根據圖片的網絡路徑去下載圖片數據(比較耗時間)

NSData *data = [NSData dataWithContentsOfURL:url];

//下載結束時間

NSDate? *end = [NSDate date];

//記錄下載所花的時間

NSLog(@"%f",[end timeIntervalSinceDate:begin]);?

//顯示圖片

self.imageView.image = [UIImage imageWithData:data];

}



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

//[self download2];

//創建子線程,去子線程加載圖片

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

}

/在主線程下載圖片計算下載圖片消耗時間

- (void)download2{

//圖片的網絡路徑

NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

//下載開始時間

CFTimeInterval? begin = CFAbsoluteTimeGetCurrent();

//根據圖片的網絡路徑去下載圖片數據(比較耗

時間)

NSData *data = [NSData dataWithContentsOfURL:url];

//下載結束時刻的時間

CFTimeInterval??end = CFAbsoluteTimeGetCurrent();

NSLog(@"%f",[end timeIntervalSinceDate:begin]);

//顯示圖片

self.imageView.image = [UIImage imageWithData:data];

}

- (void)download3{

//圖片的網絡路徑

NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];

//根據圖片的網絡路徑去下載圖片數據(比較耗

時間)

NSData *data = [NSData dataWithContentsOfURL:url];

//顯示圖片

UIImage *image?= [UIImage imageWithData:data];

//回到主線程

//方法

//[self performSelectorOnMainThread:?@selector(showImage:) withObject:image waitUntilDone: YES];

//方法2

//[self.imageView? performSelectorOnMainThread:@selector(setImage:) withObject : image withUntilDone:NO];

//方法3

[self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject: image waithUntilDone:NO];

}

//- (void) showImage:(UIImage *)image{

//self.imageView.image = image;

//}


//另外一種線程之間的通信

//NSPort;

//NSMessagePort;

//NSMachPort;


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容