Đồng thời với Grand Central Dispatch
GCD là gì?
Grand Central Dispatch được Apple tạo ra hơn 10 năm trước dưới dạng trừu tượng để giúp các nhà phát triển viết mã đa luồng mà không cần tạo và quản lý các luồng theo cách thủ công.
Đồng thời có nghĩa là hai tác vụ có thể bắt đầu, chạy và hoàn thành trong các khoảng thời gian chồng chéo. Có ba cách để đạt được đồng thời trong iOS, luồng, hàng đợi gửi và hàng đợi hoạt động.
“Thay vì phân luồng trực tiếp, bạn sử dụng GCD để lên lịch cho các tác vụ công việc và hệ thống sẽ thực hiện chúng cho bạn, tận dụng tối đa tài nguyên của hệ thống. GCD sẽ tiếp quản việc tạo các luồng cần thiết và lên lịch tác vụ của bạn trên các luồng này, chuyển gánh nặng quản lý luồng từ nhà phát triển sang hệ thống.”
Ưu điểm lớn nhất của GCD là bạn không phải suy nghĩ về tài nguyên phần cứng khi viết mã đồng thời.
“Tất cả các hàng đợi công văn đều là cấu trúc dữ liệu nhập trước, xuất trước (FIFO), vì vậy các tác vụ luôn được bắt đầu theo cùng thứ tự mà chúng được thêm vào.”
Về cơ bản có ba cách đồng thời trong iOS:
- chủ đề
- gửi hàng đợi
- hàng đợi hoạt động
“Nhược điểm của các luồng là chúng loại bỏ gánh nặng tạo ra một giải pháp có thể mở rộng cho nhà phát triển. Bạn phải quyết định số lượng chủ đề sẽ tạo và điều chỉnh số lượng đó một cách linh hoạt khi điều kiện thay đổi. Ngoài ra, ứng dụng đảm nhận hầu hết các chi phí liên quan đến việc tạo và duy trì các luồng mà nó sử dụng.”
NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(myThreadMainMethod:)
object:nil];
[myThread start];
“A DispatchQueuelà một lớp trừu tượng trên đầu hàng đợi GCD cho phép bạn thực hiện các tác vụ không đồng bộ và đồng thời trong ứng dụng của mình. Các tác vụ luôn được thực hiện theo thứ tự chúng được thêm vào hàng đợi.”
Hàng đợi nối tiếp và hàng đợi đồng thời
“Hàng đợi công văn nối tiếp chỉ thực hiện một tác vụ tại một thời điểm. Hàng đợi nối tiếp thường được sử dụng để đồng bộ hóa quyền truy cập vào một giá trị hoặc tài nguyên cụ thể để ngăn chặn các cuộc chạy đua dữ liệu xảy ra.”
let serialQueue = DispatchQueue(label: "serialQueue")
serialQueue.async {
print("Task 1 started")
// Do some work..
print("Task 1 finished")
}
serialQueue.async {
print("Task 2 started")
// Do some work..
print("Task 2 finished")
}
Task 1 started
Task 1 finished
Task 2 started
Task 2 finished
let concurrentQueue = DispatchQueue(label: "concurrentQueue",
attributes: .concurrent)
concurrentQueue.async {
print("Task 1 started")
// Do some work..
print("Task 1 finished")
}
concurrentQueue.async {
print("Task 2 started")
// Do some work..
print("Task 2 finished")
}
Task 1 started
Task 2 started
Task 1 finished
Task 2 finished
“Hàng đợi hoạt động là Cocoa tương đương với hàng đợi gửi đồng thời và được triển khai bởi lớp NSOperationQueue. Không giống như hàng đợi công văn, hàng đợi thao tác không bị giới hạn trong việc thực thi các tác vụ theo thứ tự FIFO và hỗ trợ tạo các biểu đồ thứ tự thực thi phức tạp cho các tác vụ của bạn.”
NSOperationQueue* myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperation:anOperation];
[myQueue addOperationWithBlock:^{
/* Do something. */
}];
Hàng đợi công văn chính là một hàng đợi nối tiếp có sẵn trên toàn cầu thực thi các tác vụ trên luồng chính của ứng dụng.
“Bạn có thể bắt đầu thực hiện công việc nặng nhọc trên hàng đợi nền và gửi trở lại hàng đợi chính khi bạn hoàn thành.”
DispatchQueue.main.async {
self.tableView.reloadData()
}
Mã hóa vui vẻ…

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































