ну вообще я не разбираюсь в этом, просто к тому что в оф.документации и не написано что оно должно работать в главном треде
А так тогда вызывать API с ассертами на мейн тред если очереди вместе с акторами использовать нельзя? )
И, кстати, первое, что надо запомнить, разбираясь — это что main thread != main queue. Но не всегда.
ну например используя систему сигналов. В одном месте сигнал посылаешь, в мейн треде принимаешь и делаешь что нужно
в иос всегда, поэтому и стали mainactor использовать как main thread
А как принять сигнал в мейн треде в iOS-ной аппе посланный из какого-нибудь актора?
Ну это такое — очередность "отпускания" тредов, остановленных по сигналу, не совпадает с очередностью остановки этих тредов. Т.е. делать свою реализацию очереди, основываясь на сигналах — не получится. Точнее, получится, но она не будет работать так, как ожидается.
В iOS да, но я постоянно забываю, что у нас чатик про iOS, сорян :)
думаю поэтому они и напиали эквивалент main queue, чтобы не было непонимания че это такое на серверном приложении
Возможно, да. Этакая "псевдо-main" очередь.
Не всегда таки. Могу кусок кода дать прямо сейчас. :)
да, давай, интересно
Чтоб не облажаться, проверю сначала на iOS :)
Конкретно в iOS — таки, похоже, всегда. В консольной программе macOS — не всегда. Код: let serialQueue = DispatchQueue(label: "com.my.serial.queue") let yetAnotherSerialQueue = DispatchQueue(label: "com.my.serial.queue2") DispatchQueue.global().async { print("\r1: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") serialQueue.sync { print("\r2: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") DispatchQueue.main.sync { print("\r3: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") yetAnotherSerialQueue.sync { print("\r4: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") } } } }
ну в ios это всетаки критически важно чтобы всегда можно было вызвать кусок кода из main thread. Если DispatchQueue.main это не гарантирует, то кому тогда вообще верить?
так это просто две serial queues, а если запустить одну через dispatchMain() ? будет по идее всегда на мейн треде
Что значит "просто"? DispatchQueue.main — это главная очередь, не какая-нибудь там "одна из".
А, понял. Интересно, как они в iOS добились что всегда мейн?
Подкрутили где-то наверное
а на вапоре не так что ли?)
Я не проверял, но похоже, что нет...
На вапоре был issue на гитхабе, что DispatchQueue.main вообще не активна, и если вы, дескать, используете в своем коде диспетчеризацию в главную очередь, то она не будет выполняться. Предлагали починить.
А что будет если в начале объявить очереди DispatchQueue(label: “”, attributes: .concurrent) Не за компом, проверить не могу пока сам.
1: <NSThread: 0x600003c664c0>{number = 6, name = (null)} Label: None 2: <NSThread: 0x600003c664c0>{number = 6, name = (null)} Label: None 3: <_NSMainThread: 0x600003c1ce00>{number = 1, name = main} Label: com.apple.main-thread 4: <_NSMainThread: 0x600003c1ce00>{number = 1, name = main} Label: com.apple.main-thread
А ну да, там же все .sync 🤦♂️ интересно как будет с .async. Ладно, спать в любом случае пойду, тяжело уже код читать. 😅
Не, я уже наигрался в свое время всякими вариантами, мне больше неинтересно :)
Ну насколько помню DispatchQueue serial по дефолту и и async там надо учитывать. Короче да, завтра сам гляну. 🙂
Не все, 1-й sync, остальные асинки
Наоборот же? 🤔
Ой. Ну да, сорян :)
Так это меняет картину, если написать `
Так это меняет картину, если написать let serialQueue = DispatchQueue(label: "com.my.serial.queue") let yetAnotherSerialQueue = DispatchQueue(label: "com.my.serial.queue2") DispatchQueue.global().sync { print("\r1: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") serialQueue.async { print("\r2: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") DispatchQueue.main.async { print("\r3: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") yetAnotherSerialQueue.async { print("\r4: \(Thread.current)\r" + "Label: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r") } } } }
Обсуждают сегодня