ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] ํŒ์—… ์•Œ๋ฆผ์ฐฝ ๊ตฌํ˜„ ์ค‘ ๋ฐœ์ƒํ•œ Cannot be called with asCopy = NO on non-main thread. ๋ฌธ์ œ ํ•ด๊ฒฐ
    iOS 2022. 7. 7. 01:21

    ๋‚˜๋Š” ์›๋ž˜ ๋ณดํ†ต ํŒ์—… ์•Œ๋ฆผ์ฐฝ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด UIViewController์˜ extension์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๊ณค ํ•œ๋‹ค.

    import UIKit
    
    extension UIViewController {
        func alert(title: String = "์•Œ๋ฆผ",
                   message: String,
                   okTitle: String = "ํ™•์ธ",
                   handler: ((UIAlertAction) -> Void)? = nil) {
            let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    
            let okAction = UIAlertAction(title: okTitle, style: .default, handler: handler)
            alert.addAction(okAction)
    
            present(alert, animated: true, completion: nil)
        }
    }

     

    ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ด ํŒ์—…์ฐฝ์„ ๋„์›Œ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

    ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ทธ๋ƒฅ ์ด alert ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋‹ˆ ์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

    Thread 7: "Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.”

     

    ๋‹น์—ฐํžˆ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

    ๊ทธ๋ž˜์„œ ๋‚˜๋Š” present ๋ฉ”์„œ๋“œ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ๋‹ค.

    DispatchQueue.main.async {
        self.present(alert, animated: true, completion: nil)
    }

     

    ์‹คํ–‰ํ•˜๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์•Œ๋ฆผ์ฐฝ์ด ๋œจ๊ณ  ํฌ๋ž˜์‹œ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ฝ˜์†”์— ์ด๋Ÿฐ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

    [Assert] Cannot be called with asCopy = NO on non-main thread.

     

    ์ด๊ฒŒ ๋ญ”๊ฐ€ ์‹ถ์–ด์„œ ๊ตฌ๊ธ€๋ง์„ ํ•˜๋‹ˆ ๋˜‘๊ฐ™์€ ์งˆ๋ฌธ์„ ๋ฐœ๊ฒฌ!

     

    DispatchQueue : Cannot be called with asCopy = NO on non-main thread

    I am presenting the UIAlertController on the main thread as : class HelperMethodClass: NSObject { class func showAlertMessage(message:String, viewController: UIViewController) { let

    stackoverflow.com

     

     

    present ๋˜๋Š” ๋ถ€๋ถ„๋งŒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ alert ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ main ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ๋‹ฌ๋ ค์žˆ์—ˆ๋‹ค.

    ์™œ alert ๋ฉ”์„œ๋“œ ์ „์ฒด๋ฅผ main์—์„œ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š”์ง€ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ”๋Š”๋ฐ, ๋งˆ์นจ ๋‚˜์™€ ๋น„์Šทํ•œ ์˜๋ฌธ์ ์„ ๊ฐ€์ง€์‹  ๋ถ„์˜ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์žˆ์—ˆ๋‹ค.

     

     

     

    UIAlertContoller๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

     

    ์‹ค์ œ๋กœ Thread.isMainThread๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด ํ™•์ธํ•ด๋ณด๋‹ˆ,

    alert ๋ฉ”์„œ๋“œ๋Š” ์• ์ดˆ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ ์—์„œ ํ˜ธ์ถœ์ด ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— alert ๋ฉ”์„œ๋“œ ์ž์ฒด๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ ์—์„œ ์‹คํ–‰์ด ๋˜๊ณ  ์žˆ์—ˆ๊ณ , present ๋˜๋Š” ๋ถ€๋ถ„๋งŒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์—์„œ ์‹คํ–‰์ด ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด, ์™œ UIAlertController๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด์•ผํ•˜๋Š”๊ฐ€?!

     

    ๋ชจ๋“  ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— UIAlertController ๋˜ํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์–ธ์ œ๋“ ์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ทฐ๋ฅผ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, UIViewController๋ฅผ ์ƒ์†ํ•˜๋Š” UIAlertController ๋˜ํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

     

     

    ๊ทธ๋ž˜์„œ ์ด alert ๋ฉ”์„œ๋“œ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ ์™„๋ฃŒ~!

    DispatchQueue.main.async {
        self.alert(message: "๊ถŒํ•œ์ด ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
    }

     

    ๊ทผ๋ฐ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ,,,! with asCopy = NO ๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š๋Š”๋ฐ ๋ฌด์Šจ ๋ง์ผ๊นŒ..? ์ฐพ์•„๋ด๋„ ์•ˆ ๋‚˜์˜ค๋Š”๋ฐ ์ด๊ฑด ๋” ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค..

    'iOS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [iOS] Sharing Framework?  (0) 2023.02.03
    [iOS] Command CompileSwiftSources failed with a nonzero exit code ์˜ค๋ฅ˜ ํ•ด๊ฒฐ  (0) 2022.07.08
    [iOS] Coordinator Design Pattern ๋ฒˆ์—ญ  (1) 2022.05.26
    [iOS] safeAreaLayoutGuide  (0) 2022.05.26
    [iOS] SwiftLint ์ ์šฉํ•˜๊ธฐ  (0) 2022.05.10

    ๋Œ“๊ธ€

Designed by Tistory.