Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Slide DevCoach

Slide DevCoach

DevCoach 140 : iOS | Mastering Asynchronous Programming in iOS

shabilla

April 08, 2024
Tweet

More Decks by shabilla

Other Decks in Programming

Transcript

  1. Developer Coaching #138 iOS Developer • Memahami pentingnya penggunaan font

    dan warna ketika membuat sebuah design. • Memahami cara membangun tampilan antarmuka pengguna dengan baik. • Memahami cara membangun pengalam pengguna dengan baik. • Mengerti perbedaan teknik dalam menyusun tampilan aplikasi iOS dengan Android. • Mengetahui tahapan proses dalam membangun rancangan aplikasi iOS.
  2. Learning Objectives • Memahami cara kerja concurrency dan threading dalam

    Swift. • Memahami berbagai tipe dispatch dan threading untuk manajemen thread. • Memahami perbedaan antara serial dan concurrent, serta synchronous dan asynchronous. • Memahami cara terbaru untuk menangani proses dengan async/await. iOS Developer
  3. Concurrency Concurrency adalah kemampuan komputer untuk melakukan beberapa tugas atau

    pekerjaan secara bersamaan. Setiap aplikasi yang prosesnya cukup memakan waktu sebaiknya menggunakan concurrency. iOS Developer
  4. Thread Thread adalah sekumpulan instruksi yang akan dijalankan di runtime.

    Setiap proses memiliki minimal 1 thread. Di iOS, proses utama ketika aplikasi dijalankan disebut main thread. Di sinilah semua proses yang berhubungan dengan UI dibuat dan diatur. iOS Developer
  5. Grand Central Dispatch Sebuah pendekatan desain untuk membantu kita melakukan

    manajemen thread tanpa perlu membuat thread secara manual. Pada dasarnya dispatch itu adalah antrian yang di dalamnya terdapat tugas-tugas yang harus dikerjakan. iOS Developer
  6. Dispatch Queue • Main dispatch queue: dieksekusi secara serial dan

    bisa langsung digunakan. • Global queues: dieksekusi secara concurrent dan bisa langsung digunakan. • Private queues: dieksekusi secara serial atau concurrent. Developer harus membuatnya terlebih dahulu. iOS Developer
  7. Serial Queue Serial Queue akan mengeksekusi tugas yang diberikan secara

    berurutan, dan tidak akan melanjutkan tugas berikutnya sebelum tugas yang sedang dikerjakan selesai. iOS Developer
  8. Concurrent Queue Mengeksekusi tugas secara berurutan, tetapi antrian concurrent tidak

    perlu menunggu tugas pertama selesai untuk memulai tugas berikutnya. Dengan Concurrent Queue, sistem dapat membuat multiple threads untuk menyelesaikan tugas yang ada. iOS Developer
  9. Synchronous Queue Metode ini akan menyebabkan blocking di thread pemanggil.

    Dengan menggunakan sync maka thread pemanggil akan menunggu tugas-tugas yang ada di dalam antrian selesai dieksekusi baik secara serial ataupun concurrent. iOS Developer
  10. Asynchronous Queue Kebalikan dari metode sinkron, metode ini akan langsung

    mengembalikan kontrol ke thread pemanggil setelah task dimasukkan ke dalam antrian tanpa perlu menunggu sampai selesai. Metode asinkron tidak akan melakukan blocking di thread pemanggil. iOS Developer
  11. Contoh Kode iOS Developer iOS Developer let serial = DispatchQueue(

    label: "com.dicoding.sync.serial" ) serial.sync { for _ in 0..<5 { print("red") } } serial.sync { for _ in 0..<5 { print("blue") } } print("Proses selanjutnya") let concurrent = DispatchQueue( label: "com.dicoding.sync.concurrent", attributes: .concurrent ) concurrent.async { for _ in 0..<5 { print("red") } } concurrent.async { for _ in 0..<5 { print("blue") } } print("Proses selanjutnya")
  12. func expensiveTask( data: String, completion: @escaping (String) -> Void )

    { let queue = DispatchQueue( label: "com.dicoding.completionblock" ) queue.async { print("Processing: \(data)") sleep(2) // Imitate expensive task completion("Processing \(data) finished") } } let mainQueue = DispatchQueue( label: "com.dicoding.main", qos: .userInteractive ) mainQueue.async { expensiveTask(data: "Get User") { result in print(result) } print("Main Queue Run") } Completion Block (callback) Sebuah kode di mana Anda memakainya untuk menghubungkan satu thread ke thread lainnya (thread dependency). Completion Block sendiri sebenarnya adalah sebuah Closure, yang artinya Anda harus mengirimkan sebuah fungsi (function) sebagai parameter. iOS Developer
  13. protocol TaskDelegate { func taskFinished(result: String) } struct Task {

    var delegate: TaskDelegate? func expensiveTask(data: String) { let queue = DispatchQueue( label: "com.dicoding.completionblock" ) queue.async { print("Processing: \(data)") sleep(2) // Imitate expensive task self.delegate?.taskFinished( result: "Processing \(data) finished" ) } } } Delegation Sebuah pola di mana sebuah object dapat berinteraksi dengan object lain dengan menggunakan protocol. Dalam bahasa pemrograman lain protocol ini mempunyai fungsi yang hampir mirip dengan interface. iOS Developer
  14. struct Main: TaskDelegate { func run() { let mainQueue =

    DispatchQueue( label: "com.dicoding.main", qos: .userInteractive ) mainQueue.async { var task = Task() task.delegate = self task.expensiveTask(data: "Get User") print("Main Queue Run") } } func taskFinished(result: String) { // Delegation print(result) } } let main = Main() main.run() Delegation Sebuah pola di mana sebuah object dapat berinteraksi dengan object lain dengan menggunakan protocol. Dalam bahasa pemrograman lain protocol ini mempunyai fungsi yang hampir mirip dengan interface. iOS Developer
  15. func processImageData1( completionBlock: (_ result: Image) -> Void ) {

    loadWebResource("dataprofile.txt") { dataResource in loadWebResource("imagedata.dat") { imageResource in decodeImage(dataResource, imageResource) { imageTmp in dewarpAndCleanupImage(imageTmp) { imageResult in completionBlock(imageResult) } } } } } processImageData1 { image in display(image) } Background Banyak proses asynchronous menggunakan closure dan completion handler. Namun, penggunaannya sangatlah sulit dan rumit sehingga sering bermasalah, terutama ketika terlalu banyak asynchronous operation, error handling, atau control flow antara proses asynchronous. iOS Developer
  16. Asynchronous Function Sebuah function atau method spesial yang dapat ditangguhkan

    (suspended) ketika runtime. Berbeda dengan synchronous function karena ketika function dipanggil, ia akan menjalankan completion, mengembalikan sebuah error, atau tidak mengembalikan apa pun. iOS Developer
  17. iOS Developer Membuat Function func getMovies(completionBlock: (_ movies: [MovieModel]) ->

    Void) { let movies = // Proses async untuk mendapatkan data movies dari API. completionBlock(movies) } func downloadPhoto(url: String, completionBlock: (_ poster: UIImage) -> Void) { let poster = // Proses async untuk mendapatkan poster dari API. completionBlock(poster) } Delegation
  18. iOS Developer Membuat Function func getMovies(completionBlock: (_ movies: [MovieModel]) ->

    Void) { let movies = // Proses async untuk mendapatkan data movies dari API. completionBlock(movies) } func downloadPhoto(url: String, completionBlock: (_ poster: UIImage) -> Void) { let poster = // Proses async untuk mendapatkan poster dari API. completionBlock(poster) } Delegation func getMovies() async -> [MovieModel]) { let movies = // Proses async untuk mendapatkan data movies dari API. return movies } func downloadPhoto(url: String) async -> UIImage) { let poster = // Proses async untuk mendapatkan poster dari API. return poster } Async Await
  19. iOS Developer Pemanggilan Function getMovies() { movies in let newMovie

    = movies[movies.count-1] downloadPhoto(url: newMovie.poster) { poster { show(poster) } } Delegation
  20. iOS Developer Pemanggilan Function getMovies() { movies in let newMovie

    = movies[movies.count-1] downloadPhoto(url: newMovie.poster) { poster { show(poster) } } let movies = await getMovies() let newMovie = movies[movies.count-1] let poster = await downloadPhoto(url: newMovie.poster) show(poster) Delegation Async Await
  21. Combine Menangani secara khusus asynchronous events dengan mengombinasikan operator event-processing.

    • Publisher : sumber atau sesuatu yang menghasilkan nilai. • Operator : sesuatu yang dapat bekerja dengan nilai tersebut. • Subscriber : sesuatu yang peduli dengan nilai-nilai tersebut. iOS Developer
  22. iOS Developer Pentingnya memahami konsep concurrency dalam pengembangan aplikasi untuk

    mencegah blocking proses di thread utama. Dengan menggunakan dispatch queue, async/await, dan operation, kinerja aplikasi dapat ditingkatkan untuk pengalaman pengguna yang lebih baik. Teruslah eksplorasi dan praktikkan konsep ini dalam pengembangan aplikasi Anda!
  23. Feedback! Hadiah: • 1 Token Langganan Academy (30 Hari) *untuk

    pengisi feedback terpilih! dicoding.id/devcoachfeedback