Kiến thức yêu cầu:
Thông thường, khi chúng ta download dữ liệu như JSON, hình ảnh sẽ cần sử dụng Completion Handlers để thông báo kết quả của việc download này như thế nào.
Để dễ hiểu mình sẽ lấy ví dụ 1 hàm _tượng trưng _cho việc download JSON từ trang niviki.com/toppost/json. Chỉ là giả định thôi nha, link này không có dữ liệu gì đâu
Nhìn vào tham số của hàm:
loadData( url : String, completion : (String) -> () )
Để dễ hiểu, bạn cứ đọc câu thần chú là: Khi hoàn thành thì completion của tui sẽ gắn với 1 String và không trả về gì hết
Cách viết khác:
loadData( url : String, completion : (result : String) -> Void )
Nếu viết theo kiểu dài dòng này thì trong hàm khi gán giá trị cho completion, bạn phải dùng: Bên trong hàm
loadData
bạn xử lý logic như tải dữ liệu chẳng hạn, tải xong thì bạn gán dữ liệu vào completion
. Đương nhiên để cho dễ hiểu mình cho completion
là String
thôi, bạn có thể trả về bất kỳ kiểu gì bạn thích. Chẳng hạn mình đang viết một app download bảng xếp hạng TOP Music Video thì mình sẽ dùng:
func loadData(url : String, completion : ([MusicVideo]) -> Void )
[MusicVideo]
là một mảng class của mình.
Với hàm tượng trưng ban đầu, để gọi (sử dụng) hàm này, ta dùng:
Với 2 đối số là url
và completion
. (Thực chất completion
là hàm, bạn có thể xem thêm về closure tại đây. )
url
thì dễ hiểu rồi, với completion
thì chúng ta điền gì vào?
Có 2 cách:
func didLoadData(number : String) -> (){
print(number)
}
Mình đặt tên hàm là didLoadData
, bạn có thể đặt tên hoa mỹ hơn như daTaiXongDuLieuRoiNe
cũng được.
Bạn chú ý tham số của hàm didLoadData
là (number : String)
và kiểu trả về là -> ()
Bạn thấy quen không? Tức là cái completion bạn khai báo sao thì hàm didLoadData bạn khai báo giống như vậy. Đại ý của Apple là 2 cái khớp thì mới ráp vô hàm loadData được đó. Khi sử dụng bạn chỉ cần
loadData(url: "khoa.com", completion: didLoadData)
Lúc này, kết quả sẽ ra:
Khong thay data dau het a, hihhih
Cái này thì nhìn ảo diệu và ngắn ngọn hơn.
loadData(url:`"`niviki.com/toppost/json`"`){
result in
print(result)
}
Bây giờ có 2 nhân vật mới là result và in xuất hiện.
result đại diện cho tham số được khai báo tại completion - tức là một chuỗi String trong ví dụ trên. Tại sao lại đặt result, tui muốn đặt tên khác được không? Được chứ!
loadData(url: "
niviki.com/toppost/json"){
ketquane in
print(ketquane)
}
Lúc này, kết quả sẽ ra:
Day la data ne
Ngoài ra, bạn có thể chơi trội bằng cách xử dụng shorthand như vầy:
loadData(url: "niviki.com/toppost/json"){
print($0)
}
Vì có một tham số nên bạn biết result
lúc này tương đương với $0
. Xem thêm về closure tại đây.
Tuy nhiên bài viết vẫn chưa đề cập đến Completion Handlers có kiểu trả về (return). Bạn đọc có thể tìm hiểu thêm.
Rất hoan nghênh mọi đóng góp, phản hồi, khiếu nại từ bạn đọc gần xa qua ô bình luận phía dưới, còn ngại ngần gì nữa mà không thể hiện khả năng anh hùng bàn phím của bạn!
Awaiting for your comment!!!
Bài viết liên quan
[Case Study] - StatcWeb.Studio dùng nocode để làm tool nocode: 200h - 0 sales - 5 min(s) read - published on January 24, 2021[Case Study] Bán No-code MVP làm trong 100h giá $5000 - 11 min(s) read - published on January 15, 2021Chi tiết mình validate idea với nocode - 3 tuần 60 sales - $567 - 7 min(s) read - published on December 15, 2020Do things that don't scale - Lời khuyên tốt nhất để validate idea làm app - 2 min(s) read - published on November 22, 2020GPT-3 sẽ là phát minh quan trọng kể từ Blockchain - 4 min(s) read - published on September 15, 2020#6 - NoCode MVP - Tổng kết - 5 min(s) read - published on August 22, 2020#5 - NoCode MVP - Buông bỏ để hạnh phúc - 2 min(s) read - published on July 28, 2020#4 - NoCode MVP - Ý tưởng. Một lần chơi lớn - 4 min(s) read - published on July 2, 2020#3 - NoCode MVP - Sức mạnh của Bubble.io - 5 min(s) read - published on June 29, 2020#2 - NoCode MVP - Tại sao là NoCode và tương lai của nó - 7 min(s) read - published on June 28, 2020