Tôi đã có một cảnh quay ở kotlin multiplatform và nó rất tuyệt vời, nhưng việc phân luồng khiến tôi khó chịu. Việc đóng băng trạng thái giữa các luồng có ý nghĩa về mặt khái niệm và hoạt động tốt trong các ví dụ đơn giản khi các đối tượng nhỏ hoặc nguyên thủy được truyền qua lại, nhưng trong các ứng dụng thế giới thực, tôi không thể vượt qua được InvalidMutabilityException.
Lấy đoạn mã phổ biến sau đây từ ứng dụng android
class MainViewModel(
private val objectWhichContainsNetworking: ObjectWhichContainsNetworking
)
private var coreroutineSupervisor = SupervisorJob()
private var coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main + coreroutineSupervisor)
private fun loadResults() {
// Here: Show loading
coroutineScope.launch {
try {
val result = withContext(Dispatchers.Default) { objectWhichContainsNetworking.fetchData() }
// Here: Hide loading and show results
} catch (e: Exception) {
// Here: Hide loading and show error
}
}
}
Không có gì phức tạp lắm, nhưng nếu được sử dụng trong mã phổ biến và chạy từ Kotlin / Native thì pow InvalidMutabilityException trên MainViewModel.
Có vẻ như lý do cho điều này là bất cứ thứ gì được truyền vào withContext đều bị đóng băng đệ quy vì objectWhichContainsNetworking là một thuộc tính của MainViewModel và được sử dụng trong withContext thì MainViewModel sẽ bị đóng băng.
Vì vậy, câu hỏi của tôi là, đây chỉ là một hạn chế của mô hình bộ nhớ Kotlin / Native hiện tại? Hoặc có lẽ là phiên bản hiện tại của coroutines? Và có cách nào làm tròn điều này không?
Lưu ý: phiên bản coroutines: 1.3.9-native-mt. kotlin phiên bản 1.4.0.
Chỉnh sửa 1: Có vẻ như đoạn mã thu gọn ở trên thực sự hoạt động tốt. Hóa ra mã buộc tội là một var có thể cập nhật trong mô hình chế độ xem (được sử dụng để giữ một tham chiếu đến trạng thái chế độ xem cuối cùng) bị đóng băng và sau đó ném ngoại lệ khi nó cố gắng bị thay đổi. Tôi sẽ cố gắng sử dụng Dòng / Kênh để đảm bảo không cần tham chiếu var và xem liệu điều này có khắc phục được sự cố tổng thể hay không.
Lưu ý: nếu có cách nào đó để tránh việc MainViewModel bị đóng băng ngay từ đầu thì sẽ rất tuyệt vời!
Chỉnh sửa 2: Đã thay thế var bằng Flow. Tôi không thể thu thập quy trình chuẩn trong iOS cho đến khi sử dụng trình trợ giúp tại đây:https://github.com/JetBrains/kotlinconf-app/blob/master/common/src/mobileMain/kotlin/org/jetbrains/kotlinconf/FlowUtils.kt.
MainViewModel vẫn bị đóng băng, nhưng vì tất cả trạng thái của nó là không thay đổi nên không còn là vấn đề nữa. Hy vọng nó sẽ giúp một ai đó!
Trong mã gốc của bạn, bạn đang tham chiếu đến một trường của đối tượng mẹ, điều này khiến bạn nắm bắt toàn bộ đối tượng gốc và đóng băng nó. Nó không phải là một vấn đề với coroutines. Coroutines tuân theo các quy tắc tương tự như tất cả các thư viện đồng thời khác trong Kotlin / Native. Nó đóng băng lambda khi bạn vượt qua các chủ đề.
class MainViewModel(
private val objectWhichContainsNetworking: ObjectWhichContainsNetworking
)
//yada yada
private fun loadResults() {
coroutineScope.launch {
try {
val result = withContext(Dispatchers.Default) {
//The reference to objectWhichContainsNetworking is a field ref and captures the whole view model
objectWhichContainsNetworking.fetchData()
}
} catch (e: Exception) {}
}
}
Để ngăn điều này xảy ra:
class MainViewModel(
private val objectWhichContainsNetworking: ObjectWhichContainsNetworking
){
init{
ensureNeverFrozen()
}
//Etc
Điều phức tạp nhất với mô hình bộ nhớ là điều này. Làm quen với những gì được nắm bắt và tránh nó. Không quá khó khi bạn làm quen nhưng bạn cần học những điều cơ bản.
Tôi đã nói nhiều về điều này:
Kotlin thực tế / Đồng tiền bản địa
Kotlin Native Concurrency bắt tay
KotlinConf KN Concurrency
Mô hình bộ nhớ đang thay đổi, nhưng sẽ khá lâu trước khi nó hạ cánh. Khi bạn đã quen với mô hình bộ nhớ, các vấn đề bất biến thường dễ dàng chẩn đoán.
Jana Duggar đã cởi mở về việc tìm kiếm tình yêu của mình. Đây là tất cả những gì cô ấy nói về chủ đề này và khoảng thời gian 5 năm kết hôn của cô ấy.
Ngôi sao của 'Outlander' Sam Heu Afghanistan gần đây đã tiết lộ những gì anh ấy sẽ làm từ phim trường để tưởng nhớ Jamie Fraser, vai diễn đã đưa anh ấy trở thành một ngôi sao.
"She Loves You" được viết trong một giờ, thu âm trong một ngày và là bài hát của The Beatles với một trong những màn trình diễn xuất sắc nhất trong sự nghiệp của họ.
Dolly Parton và bà Bessie của cô ấy có một mối quan hệ đặc biệt. Bà Parton ốm nặng, nhưng điều đó không ngăn được Dolly chơi khăm bà.
Bạn có thể nghĩ rằng gỗ sồi hoặc gỗ hồ đào rất cứng, nhưng khi nói đến loại gỗ cứng nhất thế giới thì chúng thậm chí còn không có loại nào sánh bằng.
Đại dương tràn ngập vẻ đẹp, nhưng cũng ẩn chứa một số sinh vật biển đáng sợ nhất hành tinh. Nhiều loài trong số này ẩn núp sâu dưới bề mặt đại dương, trong thế giới tối tăm, áp suất cao của biển sâu.
Nếu bạn đang chiến đấu với quái vật hung hãn hoặc chuẩn bị cho các tình huống PvP, việc nắm rõ những phép thuật kiếm tốt nhất trong Minecraft có thể mang lại cho bạn lợi thế lớn. Phép thuật kiếm cho phép bạn gây nhiều sát thương hơn, tăng lượng quái vật rơi ra và kéo dài độ bền của kiếm.
Khi nói đến các nước xã hội chủ nghĩa, người ta thường hình dung ra sự kiểm soát hoàn toàn của chính phủ và không có sở hữu tư nhân. Nhưng trên thực tế, các nền kinh tế xã hội chủ nghĩa rất khác nhau.
“Những đứa trẻ” tung dàn khách mời tên tuổi và nhiều tin tức chấn động
Chiếc RAV4 này được khẳng định là ở tình trạng tuyệt vời và được chuẩn bị cho một trò chơi ghế âm nhạc.
Cảnh quay từ máy bay không người lái đã ghi lại cảnh lính cứu hỏa dường như đang cố gắng dập tắt ngọn lửa.
Eyes of Wakanda liên kết trực tiếp với MCU, cùng với các cập nhật về X-Men '97, What If..., Daredevil, v.v.
Marilyn Monroe đã mặc một chiếc váy trắng nổi tiếng trong bộ phim 'The Seven Year Itch'. Sau đây là mọi thông tin cần biết về chiếc váy và khoảnh khắc mang tính biểu tượng của Monroe trên song sắt tàu điện ngầm.
John Cleese kết hôn với vợ mình, Jennifer Wade, vào năm 2012. Sau đây là mọi thông tin cần biết về vợ của John Cleese, Jennifer Wade.
Patton Oswalt kết hôn với vợ mình, nữ diễn viên Meredith Salenger, vào năm 2017. Sau đây là mọi thông tin cần biết về vợ của Patton Oswalt, Meredith Salenger.
Michael C. Hall đã kết hôn với vợ Morgan Macgregor từ năm 2016. Dưới đây là tất cả những điều cần biết về vợ của Michael C. Hall.
Nó đập vào mắt tôi Đột ngột như nó thường xảy ra Nó lại ở giữa chừng <Không, không phải cái ở Thái Bình Dương đâu bạn màu hạt dẻ, cái ở lễ hội hóa trang> Mọi tiêu đề đều ầm ĩ…..
Vào năm 2022, với việc phát hành GPT-3, kỹ năng viết dường như trở nên ít quan trọng hơn. Với AI, những người viết kém cũng có thể tạo ra đội ngũ nhân viên chất lượng.
Trong thế giới có nhịp độ nhanh và cạnh tranh ngày nay, sự nghiệp của một người đóng một vai trò quan trọng trong sự phát triển cá nhân, ổn định tài chính và sự hài lòng trong cuộc sống nói chung. Tuy nhiên, nhiều cá nhân thấy mình bị mắc kẹt trong một chu kỳ trì trệ và không hài lòng không ngừng, dần dần lãng phí trong cuộc sống nghề nghiệp của họ.
Tuần trước, tôi nhận thấy một thông cáo báo chí, được gửi qua PressGazette (một trang web tin tức truyền thông của Anh). Bài báo thông báo rằng Acast, công ty quảng cáo và lưu trữ podcast của Scandi, sẽ lãnh đạo một tập đoàn gồm các nhà xuất bản “có lẽ là có ảnh hưởng nhất” trong lĩnh vực podcasting.