Vấn đề với slider và đưa dữ liệu ra khỏi closures

Mình muốn cho giá trị slider chạy theo thời gian bài hát đang phát (như mấy ứng dụng nghe nhạc thông thường) Mặc dù sử dụng các biến global nhưng giá trị max của slider (bằng duration của bài hát) được gán trong clousure bị mất ngay sau khi ra khỏi closure, và slider cũng không hoạt động.
Mọi người giải thích và sử giúp mình với. tks !

không phải bị mất khi ra khỏi closure mà là do timer sẽ chạy trên 1 queue khác main queue, do đó k thể thay đổi UI được, cách giải quyết là wrap nội dung method sliderChanging() add vào trong main queue,

DispatchQueue.main.async {
      self.sliderButton.value = Float(avAudioPlayer.currentTime)      
}

hoặc

DispatchQueue.main.sync {
      self.sliderButton.value = Float(avAudioPlayer.currentTime)      
}
2 Likes

Mình sloved rồi :smiley: cảm ơn bạn. Bạn có thể giải thích cho mình rõ hơn về DispatchQueue.main.async được không
Lấy img qua Url mình cũng dùng hàm này mà thực sự chưa hiểu rõ nó lắm

1 application trong iOs sẽ chạy trên 1 looper gọi là main queue, hay còn gọi là mô hình message queue, nói thì cao siêu nhưng thực chất là 1 t vòng lặp dạng

while (true) {
 popQueueEvent,
 executeQueueEvent 
}

Để thay đổi được các thuộc tính của các thành phần trong UI thì bắt buộc phải chạy trên main thread hay còn gọi là UI thread, nhưng vấn đề là bạn không thể thao tác trực tiếp được tới thread này hay không có cách nào để gọi nó ra rồi bắt nó chạy lệnh của bạn được, đó đó bạn phải add 1 event chèn vào main queue, khi đó event mà bạn chèn vào có chứa code của bạn sẽ được pop ra và execute ở trong vòng lặp while true kia trên main thread, khi ấy thì thay đổi liên quan tới UI mới được thực hiện, điều này cũng đúng với Global queue, tuy nhiên Global queue là 1 thread queue độc lập với main queue để thực hiện các tác vụ tốn thời gian hơn nhường chỗ cho main queue vì main queue có liên quan đến UI nên mỗi event add vào phải chạy nhanh nhất có thể.
Method async có nghĩa là add event xong là kệ nó, làm tiếp câu lệnh tiếp theo, còn method sync sẽ đợi event được add vào chạy xong rồi mới làm câu lệnh tiếp theo

2 Likes

Khi mình sử dụng sync thay vì async trong DispatchQueue.global() xảy ra hiện tượng lag. Đây có lẽ là do sync nó chờ event chạy xong phải không

Khái niệm “chạy trên 1 queue khác main queue” là như thế nào vậy bạn? Làm sao để biết khi nó nhảy sang 1 queue nào đó

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?