Middle+
Кадом намунаи равобити дар iOS-ро метавонед оварда диҳед?
sobes.tech AI
Ҷавоб аз AI
Беҳтарин мисоли дедлок дар iOS вақте рӯй медиҳад, ки кӯшиш мекунем UI-ро аз ҷараёни пасзамина бо истифода аз механизмҳои махсус навсозӣ кунем.
// Ин код дедлок ё катиҳоро ба вуҷуд меорад (бар асоси версияи iOS ва контекст)
// вақте ки аз ҷараёни асосӣ хориҷ карда мешавад
DispatchQueue.global().async {
// Корро дар пасзамина иҷро мекунем...
print("Кор дар пасзамина иҷро мешавад")
// кӯшиш мекунем UI-ро мустақиман аз ҷараёни пасзамина навсозӣ кунем
// Ин сабаби хатогӣ ё дедлок мешавад, зеро UIKit бехатарии ҷараёнро намедонад
DispatchQueue.main.syncが必要です!
// Ин барои намоиш додани мушкилот илова шудааст - дар коди воқеӣ чунин кардан мумкин нест!
DispatchQueue.main.sync {
// кӯшиш барои навсозии тамғаи дар ҷараёни асосӣ
// Аммо аз он ки мо аллакай синхрон интизор ҳастем, ки ҷараёни асосӣ иҷро кунад, ки баста шудааст
// бо блоки синхронии фиристодашуда, дедлок ба вуҷуд меояд.
print("Кӯшиш барои навсозии UI")
// someLabel.text = "Аз пасзамина навсозӣ шуд" // Масали сатр, ки мушкилро ба вуҷуд меовард
}
print("Кор дар пасзамина анҷом ёфт")
}
Таҳлил:
UIKit (рамзӣ барои сохтани интерфейси корбар дар iOS) бехатарии ҷараёнро намедонад. Ҳамаи амалҳо бо UI бояд қатъиян дар ҷараёни асосӣ (main thread) иҷро шаванд.
Дар мисоли дар боло, агар блоки DispatchQueue.main.sync { ... }-ро аз ҷараёни пасзамина даъват кунед, пас:
- Ҷараёни пасзамина баста мешавад ва интизор мешавад, ки ҷараёни асосӣ иҷро кунад, ки блоки фиристодашударо.
- Ҷараёни асосӣ метавонад дар он вақт машғул бошад, ё, ки эҳтимолан, худ интизор аст, ки ягон амалро анҷом диҳад, ки бояд аз ҷараёни пасзамина оғоз мешуд (гарчанде дар ин мисоли мушаххас ин вуҷуд надорад, интизории синхронӣ аз ҷараёни пасзамина дар ҷараёни асосӣ мушкил аст).
- Дар ҳолати
sync, ҷараёни пасзамина наметавонад анҷом ёд, то ки ҷараёни асосӣ иҷро кунад, ки блоки фиристодашударо.
Ҳалли дуруст:
Истифодаи фиристодани асинхронӣ ба ҷараёни асосӣ барои навсозии UI.
// Ҳалли дуруст: навсозии UI асинхронӣ дар ҷараёни асосӣ
DispatchQueue.global().async {
// Корро дар пасзамина иҷро мекунем...
print("Кор дар пасзамина иҷро мешавад")
// Навсозии UI-ро асинхронӣ ба ҷараёни асосӣ мефиристем
DispatchQueue.main.async {
print("Навсозии UI дар ҷараёни асосӣ")
// someLabel.text = "Аз пасзамина навсозӣ шуд" // Макони дуруст барои навсозии UI
}
print("Кор дар пасзамина анҷом ёфт")
}
Ин ҷо, ҷараёни пасзамина дар фиристодани блок ба ҷараёни асосӣ баста намешавад, ки имкон медиҳад, ки ҳам кор дар пасзамина ва ҳам кор дар ҷараёни асосӣ мустақилона кор кунанд, ва дедлокро пешгирӣ мекунанд.