ได้รับข้อผิดพลาด“ แอปพลิเคชันนี้กำลังแก้ไขข้อผิดพลาด autolayout engine จากเธรดพื้นหลัง” หรือไม่


310

เคยพบข้อผิดพลาดนี้มากมายใน OS X ของฉันโดยใช้ swift:

"แอปพลิเคชันนี้กำลังแก้ไขเอ็นจิ้น autolayout จากเธรดแบ็คกราวน์ซึ่งอาจนำไปสู่ความเสียหายของเครื่องยนต์และข้อผิดพลาดแปลก ๆ ซึ่งจะทำให้เกิดข้อยกเว้นในการเปิดตัวในอนาคต"

ฉันมีNSWindowของฉันและฉันเปลี่ยนมุมมองไปcontentViewที่หน้าต่าง ฉันได้รับข้อผิดพลาดเมื่อฉันพยายามทำNSApp.beginSheetหน้าต่างหรือเมื่อฉันเพิ่มsubviewหน้าต่าง พยายามปิดใช้งานการเก็บข้อมูลอัตโนมัติและฉันไม่มีอะไรที่ใช้เค้าโครงอัตโนมัติ ความคิดใด ๆ

บางครั้งมันก็โอเคและไม่มีอะไรเกิดขึ้นบางครั้งมันก็ทำให้ฉันUIและไม่มีอะไรเหลือ


2
ด้วยเหตุผลบางอย่างคำตอบที่ยอดเยี่ยมด้านล่างถูกลบ: github.com/nrbrook/NBUIKitMainThreadGuard
Fattie

ช่วยฉันสองสามชั่วโมงเป็นอย่างน้อย ขอบคุณ @Fattie
oyalhi

ถูกต้อง @oyalhi ระวังใช้มันฉันสนุกกับมันจริงๆ แต่แล้วก็มีปัญหาอื่น ๆ ด้วย - มันเป็นสนามที่แข็งแกร่ง! หวังว่ามันจะช่วย!
Fattie

คำตอบ:


638

จำเป็นต้องอยู่ภายในเธรดอื่นที่อนุญาตให้ UI อัปเดตทันทีที่การดำเนินการของฟังก์ชันเธรดเสร็จสมบูรณ์:

Modern Swift:

DispatchQueue.main.async {
    // Update UI
}

Swift เวอร์ชันเก่ากว่าก่อน Swift 3

dispatch_async(dispatch_get_main_queue(){
    // code here
})

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{
    // code here
});

3
ในการทำให้สิ่งนี้ทำงานใน Objective C ให้ใส่ ^ (void) หน้า {ในบล็อกโค้ดและเซมิโคลอน afterwords
avance

4
ในขณะที่ไม่เจ็บ ^ (โมฆะ) แทนที่จะเป็นแค่ ^ ไม่จำเป็น คำตอบเวอร์ชัน Objective-C นั้นใช้ได้
Keller

2
มันใช้งานได้ดีสำหรับฉัน สำหรับปัญหาของฉันคือทำคำขอเครือข่ายและภายในบล็อกความสำเร็จฉันเรียกว่าฟังก์ชั่นเพื่อปรับปรุง UI เนื่องจาก UIKit ไม่ปลอดภัยสำหรับเธรดจึงต้องส่งกลับไปยังเธรดหลักเพื่ออัปเดต UI
Rachel

1
ดูคำตอบโดย @Naishta สำหรับโซลูชัน Swift 3
Nathaniel

1
สำหรับ Swift 3: DispatchQueue.main.async () { code } ตามที่ @Naishta กล่าว
smukamuka

146

คุณได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกันขณะทำการดีบั๊กด้วยคำสั่งพิมพ์โดยไม่ต้องใช้ 'dispatch_async' ดังนั้นเมื่อคุณได้รับข้อความแสดงข้อผิดพลาดนั่นคือเวลาที่ใช้

สวิฟต์ 4

DispatchQueue.main.async { //code }

สวิฟท์ 3

DispatchQueue.main.async(){ //code }

เวอร์ชั่นก่อนหน้าของ Swift

dispatch_async(dispatch_get_main_queue()){ //code }

5
เนื่องจากไวยากรณ์ไม่ถูกต้องควรเป็น: dispatch_async(dispatch_get_main_queue(), ^{ /* UI related code */ });แก้ไข: ฉันอัปเดตคำตอบของเขาการจัดรูปแบบไวยากรณ์ทำงานได้ดีขึ้นที่นั่น
Zoltán

1
หรือเมื่ออยู่ในช่วงปิดให้เข้าสู่เธรดเธรดจากพื้นหลังโดยใช้สิ่งนี้: self.performSelectorOnMainThread (ตัวเลือก ("yourFunction:"), พร้อมด้วย Object: 'yourArray / yourObject', waitUntilDone: true)
Naishta

1
ไม่ไม่ได้ดูที่ไวยากรณ์
Naishta

82

ข้อผิดพลาด "แอปพลิเคชันนี้กำลังแก้ไขเอ็นจินการหาค่าอัตโนมัติจากเธรดพื้นหลัง" ข้อผิดพลาดถูกบันทึกในคอนโซลนานหลังจากปัญหาที่เกิดขึ้นจริงดังนั้นการดีบักอาจทำได้ยากโดยไม่ต้องใช้เบรกพอยต์

ฉันใช้คำตอบของ @ markussvensson เพื่อตรวจสอบปัญหาของฉันและพบว่าใช้จุดพักแบบสัญลักษณ์นี้(ดีบัก> จุดพัก> จุดพักแบบสัญลักษณ์):

  1. สัญลักษณ์: [UIView layoutIfNeeded]หรือ[UIView updateConstraintsIfNeeded]
  2. เงื่อนไข: !(BOOL)[NSThread isMainThread]

ป้อนคำอธิบายรูปภาพที่นี่

สร้างและเรียกใช้แอปบนอีมูเลเตอร์และทำซ้ำขั้นตอนที่นำไปสู่ข้อความแสดงข้อผิดพลาดที่ถูกโยนทิ้ง (แอพจะช้ากว่าปกติ!) จากนั้น Xcode จะหยุดแอพและทำเครื่องหมายบรรทัดของโค้ด (เช่นการเรียก func) ที่เข้าถึง UI จากเธรดพื้นหลัง


3
อืมมม ฉันโหวตขึ้นเพราะมันดูสมเหตุสมผล อย่างไรก็ตามการดำเนินการไม่หยุดและฉันยังได้รับข้อผิดพลาดในบันทึกของฉัน มีเงื่อนไขอื่น ๆ ที่ฉันสามารถใช้เพื่อตั้งค่าเบรกพอยต์สัญลักษณ์หรือไม่?
Sjakelien

ในกรณีของฉันมันจะแตก อย่างไรก็ตามการติดตามสแต็กไม่ได้ให้คำแนะนำใด ๆ แก่ฉันว่ามุมมองใดที่รับผิดชอบ และฉันไม่รู้วิธีตีความรหัสแอสเซมเบลอร์ที่แสดงmovq 0x10880ba(%rip), %rsi ; "_wantsReapplicationOfAutoLayoutWithLayoutDirtyOnEntry:"
Reinhard Männer

มันจะไม่ทำให้แอปทำงานช้าลงอย่างจริงจังเมื่อทำการดีบั๊กหรือไม่
Itachi

@ Itachi yep ไม่รู้วิธีเร่งความเร็ว
k06a

2
เริ่มต้นด้วย Xcode 9 มันเป็นคุณสมบัติในตัว เพียงตรวจสอบให้แน่ใจว่าได้เปิดใช้งานตัวเลือก "ตัวตรวจสอบเธรดหลัก" ในแท็บ "การวินิจฉัย" ของการตั้งค่าโครงการ
AndrewPo

24

เมื่อคุณพยายามอัปเดตค่าฟิลด์ข้อความหรือเพิ่มมุมมองย่อยภายในเธรดพื้นหลังคุณจะพบปัญหานี้ ด้วยเหตุนี้คุณควรใส่รหัสประเภทนี้ในเธรดหลัก

คุณต้องตัดวิธีที่เรียกการปรับปรุง UI ด้วย dispatch_asynch เพื่อรับคิวหลัก ตัวอย่างเช่น:

dispatch_async(dispatch_get_main_queue(), { () -> Void in
   self.friendLabel.text = "You are following \(friendCount) accounts"
})

แก้ไข - SWIFT 3:

ตอนนี้เราสามารถทำตามรหัสถัดไปได้:

// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
   // Do long running task here
   // Bounce back to the main thread to update the UI
   DispatchQueue.main.async {
      self.friendLabel.text = "You are following \(friendCount) accounts"
   }
}

23

สำหรับฉันข้อความแสดงข้อผิดพลาดนี้มาจากแบนเนอร์จาก Admob SDK

ฉันสามารถติดตามต้นกำเนิดเป็น "WebThread" โดยการตั้งค่าเบรกพอยต์แบบมีเงื่อนไข

จุดพักแบบมีเงื่อนไขเพื่อค้นหาผู้ที่กำลังอัพเดต UI จากเธรดเบื้องหลัง

จากนั้นฉันก็สามารถกำจัดปัญหานี้ได้ด้วยการห่อหุ้มการสร้างแบนเนอร์ด้วย:

dispatch_async(dispatch_get_main_queue(), ^{
   _bannerForTableFooter = [[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait];
   ...
}

ฉันไม่รู้ว่าทำไมสิ่งนี้ช่วยได้เพราะฉันไม่เห็นว่ารหัสนี้ถูกเรียกมาจาก non-main-thread

หวังว่ามันจะช่วยให้ทุกคน


1
ผมมีปัญหาเหมือนกัน. ฉันสับสนว่าเหตุใดจึงมีข้อยกเว้นเกิดขึ้นใน WebThread ฉันทำการเปลี่ยนแปลงแบบเดียวกับที่คุณทำและตอนนี้ใช้งานได้ ฉันใช้ admk sdk เวอร์ชั่นล้าสมัยเล็กน้อย ฉันสงสัยว่ามันถูกแก้ไขในเวอร์ชั่นล่าสุดหรือไม่ ขอบคุณสำหรับสิ่งนี้. ฉันไม่คิดว่าฉันจะได้พบมัน
Larry

1
การอัปเดตเป็น AdMob เวอร์ชันล่าสุดแก้ไขปัญหานี้ให้ฉันได้แล้ว
JH95

ฉันได้พักที่จุดพักสัญลักษณ์เช่นนี้ แต่ไม่มีรหัสปรากฏ :(
Victor Engel

20

ฉันมีปัญหานี้ตั้งแต่อัปเดตเป็น iOS 9 SDK เมื่อฉันเรียกบล็อกที่อัปเดต UI ภายใน NSURLConnection async ตัวจัดการการร้องขอเสร็จสิ้น การเรียกการบล็อกใน dispatch_async โดยใช้ dispatch_main_queue แก้ปัญหาได้

มันทำงานได้ดีใน iOS 8


10

performSelectorInBackgroundมีปัญหาเดียวกันเพราะผมใช้


ไม่ฉันต้องทำสิ่งต่าง ๆ ในพื้นหลัง ฉันใส่การเรียก NSNotificationCenter ภายใน dispatch_async (dispatch_get_main_queue () วิธีการและมันทำงานได้
Bobby

ฉันได้รับข้อมูลจาก URLSessionDelegate ซึ่งเรียกว่า NSNotification และ UIViewController ตอบกลับการแจ้งเตือนและในนั้นฉันใช้ DispatchQueue.main.async เพื่อแสดงผู้ใช้ว่าข้อมูลดีหรือไม่ ไม่ถูกต้อง! - การแก้ปัญหาคือใส่การแจ้งเตือนในคิวหลัก DispatchQueue.main.async {NotificationCenter.default.post (ชื่อ: NSNotification.Name (rawValue: networkNotificationNames.products.rawValue), วัตถุ: ตนเอง, userInfo: [networkNotificationNames.products.rawValue: ProductList])}
iCyberPaul

7

คุณต้องไม่เปลี่ยน UI หลักในเธรดหลัก! UIKit นั้นไม่ปลอดภัยสำหรับเธรดดังนั้นปัญหาข้างต้นและปัญหาแปลกอื่น ๆ ก็จะเกิดขึ้นถ้าคุณทำเช่นนั้น แอพอาจผิดพลาดได้

ดังนั้นในการดำเนินการของ UIKit คุณต้องกำหนด block และปล่อยให้มันทำงานบนคิวหลัก: เช่น,

NSOperationQueue.mainQueue().addOperationWithBlock {

}

สิ่งนี้ไม่สามารถใช้ได้ใน Xcode 7.2 และ iOS 9.2 ทางเลือกอื่น ๆ ?
Jayprakash Dubey

7

เห็นได้ชัดว่าคุณกำลังทำการอัปเดต UI บนเธรดพื้นหลัง ไม่สามารถทำนายได้อย่างแม่นยำว่าที่ไหนโดยไม่เห็นรหัสของคุณ

นี่คือบางสถานการณ์ที่อาจเกิดขึ้น: -

คุณอาจจะทำอะไรกับเธรดพื้นหลังและไม่ได้ใช้ อยู่ในฟังก์ชั่นเดียวกันรหัสนี้ง่ายต่อการสังเกต

DispatchQueue.main.async { // do UI update here }

การเรียก func ที่ทำการร้องขอทางเว็บบนเธรดพื้นหลังและตัวจัดการความสมบูรณ์ของการเรียก func อื่น ๆ ที่กำลังทำการอัพเดท UI เพื่อแก้ปัญหานี้ให้ลองตรวจสอบรหัสที่คุณได้อัปเดต UI หลังจากการโทรผ่าน webrequest

// Do something on background thread
DispatchQueue.global(qos: .userInitiated).async {
   // update UI on main thread
   DispatchQueue.main.async {
                // Updating whole table view
                self.myTableview.reloadData()
            }
}

5

ปัญหาหลักของ "แอปพลิเคชันนี้กำลังแก้ไขเอ็นจิ้นอัตโนมัติจากกระทู้พื้นหลัง" คือดูเหมือนว่าจะเข้าสู่ระบบเป็นเวลานานหลังจากเกิดปัญหาจริงซึ่งอาจทำให้แก้ไขปัญหาได้ยาก

ฉันจัดการเพื่อแก้ไขปัญหาโดยการสร้างจุดพักสัญลักษณ์สามแห่ง

Debug> เบรกพอยต์> สร้างเบรกพอยต์สัญลักษณ์ ...

เบรกพอยต์ 1:

  • สัญลักษณ์: -[UIView setNeedsLayout]

  • เงื่อนไข: !(BOOL)[NSThread isMainThread]

เบรกพอยต์ 2:

  • สัญลักษณ์: -[UIView layoutIfNeeded]

  • เงื่อนไข: !(BOOL)[NSThread isMainThread]

เบรกพอยต์ 3:

  • สัญลักษณ์: -[UIView updateConstraintsIfNeeded]

  • เงื่อนไข: !(BOOL)[NSThread isMainThread]

ด้วยเบรกพอยต์เหล่านี้คุณสามารถรับตัวแบ่งบนบรรทัดจริงที่คุณเรียกวิธี UI อย่างไม่ถูกต้องบนเธรดที่ไม่ใช่หลัก


4

ฉันมีปัญหานี้ขณะโหลดข้อมูลใน UITableView เพียงแค่โหลดการบรรจุใหม่ดังต่อไปนี้แก้ไขปัญหาให้ฉัน

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.tableView.reloadData()
    })

นี่มันสำหรับฉัน! ฉันมีทุกอย่างอื่นในคิวหลัก แต่ reloadData ที่หลงทาง ()!
Oprimus

3

ผมมีปัญหาเหมือนกัน. ปรากฎว่าฉันใช้UIAlertsที่ต้องการคิวหลัก แต่พวกเขาได้รับเลิก
เมื่อผมเปลี่ยนUIAlertsไปUIAlertControllerผมไม่ได้มีปัญหาและไม่ได้มีการใช้dispatch_asyncรหัส บทเรียน - ใส่ใจกับคำเตือน พวกเขาช่วยแม้ในขณะที่คุณไม่คาดหวัง


3

คุณมีคำตอบรหัสที่ถูกต้องจาก @Mark แล้ว แต่เพียงเพื่อแบ่งปันสิ่งที่ค้นพบของฉัน: ปัญหาคือคุณกำลังร้องขอการเปลี่ยนแปลงในมุมมองและสมมติว่ามันจะเกิดขึ้นทันที ในความเป็นจริงการโหลดมุมมองขึ้นอยู่กับทรัพยากรที่มีอยู่ หากทุกอย่างโหลดเร็วพอและไม่มีความล่าช้าคุณจะไม่สังเกตเห็นอะไรเลย ในสถานการณ์ที่มีความล่าช้าเนื่องจากเธรดกระบวนการไม่ว่าง ฯลฯ แอปพลิเคชันจะทำงานในสถานการณ์ที่ควรแสดงบางสิ่งแม้ว่าจะยังไม่พร้อมก็ตาม ดังนั้นจึงขอแนะนำให้จัดส่งคำขอเหล่านี้ในคิวแบบอะซิงโครนัสเพื่อให้ได้รับการดำเนินการตามภาระงาน


2

ฉันมีปัญหานี้เมื่อฉันใช้ TouchID ถ้ามันช่วยคนอื่นตัดตรรกะความสำเร็จของคุณซึ่งน่าจะทำอะไรกับ UI ในคิวหลัก


2

อาจเป็นเรื่องง่ายเหมือนการตั้งค่าฟิลด์ข้อความ / ค่าป้ายกำกับหรือเพิ่มมุมมองย่อยภายในเธรดพื้นหลังซึ่งอาจทำให้เค้าโครงของฟิลด์เปลี่ยนไป ตรวจสอบให้แน่ใจว่าสิ่งที่คุณทำกับอินเทอร์เฟซนั้นเกิดขึ้นในเธรดหลักเท่านั้น

ตรวจสอบลิงค์นี้: https://forums.developer.apple.com/thread/7399


2

ฉันมีปัญหาเดียวกันเมื่อพยายามอัปเดตข้อความแสดงข้อผิดพลาดใน UILabel ใน ViewController เดียวกัน (ใช้เวลาเล็กน้อยในการอัปเดตข้อมูลเมื่อพยายามทำเช่นนั้นด้วยการเข้ารหัสปกติ) ฉันใช้DispatchQueueใน Swift 3 Xcode 8 และใช้งานได้


2

หากคุณต้องการตามล่าข้อผิดพลาดนี้ให้ใช้ตัวตรวจสอบเธรดหลักหยุดชั่วคราวในช่องทำเครื่องหมายปัญหา การแก้ไขเป็นเรื่องง่ายเกือบทุกครั้งโดยส่งบรรทัดปัญหาในคิวหลัก

ป้อนคำอธิบายรูปภาพที่นี่


1
สิ่งนี้ทำอะไรกันแน่? "ตัวตรวจสอบเธรดหลัก" ถูกเปิดใช้งานโดยค่าเริ่มต้นและฉันได้ตรวจสอบเพิ่มเติม "เธรดน้ำยาฆ่าเชื้อโรค" และ "หยุดชั่วคราวเกี่ยวกับปัญหา" สำหรับทั้งคู่ แต่มันก็ยังคงพ่นข้อความ
Neph

มันหยุดการทำงานของแอพชั่วคราวในจุดที่ UI กำลังถูกแก้ไขในเธรดพื้นหลัง
rockdaswift

แปลกมันไม่ได้ทำอย่างนั้นในแอพของฉัน (Xcode 10.2.1) ฉันต้องเพิ่มเบรกพอยต์ด้วยตนเอง (ตามที่อธิบายไว้ที่นี่ ) เพื่อให้มันหยุดและชี้ไปที่บรรทัดของรหัส
Neph

และฉันต้องทำอย่างไรเพื่อดูตัวเลือกชุดนี้
David Rector

แก้ไขแบบแผนเป้าหมายของคุณ
rockdaswift

1

สำหรับฉันปัญหาคือต่อไปนี้ ตรวจสอบให้แน่ใจว่าperformSegueWithIdentifier:มีการดำเนินการในหัวข้อหลัก:

dispatch_async (dispatch_get_main_queue(), ^{
  [self performSegueWithIdentifier:@"ViewController" sender:nil];
});

1

สวิฟต์ 4

สมมติว่าถ้าคุณกำลังเรียกวิธีการบางอย่างโดยใช้คิวการดำเนินงาน

operationQueue.addOperation({
            self.searchFavourites()
        })

และสมมติว่าฟังก์ชัน searchFavourites เป็นเช่นนั้น

func searchFavourites() {
     DispatchQueue.main.async {
                    //Your code
                }
}

หากคุณโทรรหัสทั้งหมดในวิธีการ "searchFavourites" บนเธรดหลักจะยังคงมีข้อผิดพลาดหากคุณกำลังอัปเดต UI บางอย่างในนั้น

แอปพลิเคชันนี้กำลังแก้ไขเอ็นจิ้น autolayout จากเธรดพื้นหลังหลังจากเอ็นจินเข้าถึงจากเธรดหลัก

ดังนั้นใช้วิธีแก้

operationQueue.addOperation({
            DispatchQueue.main.async {
                self.searchFavourites()
            }
        })

สำหรับสถานการณ์ประเภทนี้


1

ที่นี่ตรวจสอบบรรทัดนี้จากบันทึก

$S12AppName18ViewControllerC11Func()ySS_S2StF + 4420

คุณสามารถตรวจสอบว่าการเรียกใช้ฟังก์ชันใดจากเธรดพื้นหลังหรือตำแหน่งที่คุณเรียกใช้เมธอด api ที่คุณต้องการเรียกใช้ฟังก์ชันของคุณจากเธรดหลักเช่นนี้

DispatchQueue.main.async { func()}

func () เป็นฟังก์ชั่นที่คุณต้องการโทรในผลลัพธ์ของความสำเร็จของการเรียก api หรืออย่างอื่น

บันทึกที่นี่

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
 Stack:(
    0   Foundation                          0x00000001c570ce50 <redacted> + 96
    1   Foundation                          0x00000001c5501868 <redacted> + 32
    2   Foundation                          0x00000001c5544370 <redacted> + 540
    3   Foundation                          0x00000001c5543840 <redacted> + 396
    4   Foundation                          0x00000001c554358c <redacted> + 272
    5   Foundation                          0x00000001c5542e10 <redacted> + 264
    6   UIKitCore                           0x00000001f20d62e4 <redacted> + 488
    7   UIKitCore                           0x00000001f20d67b0 <redacted> + 36
    8   UIKitCore                           0x00000001f20d6eb0 <redacted> + 84
    9   Foundation                          0x00000001c571d124 <redacted> + 76
    10  Foundation                          0x00000001c54ff30c <redacted> + 108
    11  Foundation                          0x00000001c54fe304 <redacted> + 328
    12  UIKitCore                           0x00000001f151dc0c <redacted> + 156
    13  UIKitCore                           0x00000001f151e0c0 <redacted> + 152
    14  UIKitCore                           0x00000001f1514834 <redacted> + 868
    15  UIKitCore                           0x00000001f1518760 <redacted> + 104
    16  UIKitCore                           0x00000001f1543370 <redacted> + 1772
    17  UIKitCore                           0x00000001f1546598 <redacted> + 120
    18  UIKitCore                           0x00000001f14fc850 <redacted> + 1452
    19  UIKitCore                           0x00000001f168f318 <redacted> + 196
    20  UIKitCore                           0x00000001f168d330 <redacted> + 144
    21  AppName                        0x0000000100b8ed00 $S12AppName18ViewControllerC11Func()ySS_S2StF + 4420
    22  AppName                        0x0000000100b8d9f4 $S12CcfU0_y10Foundation4DataVSg_So13NSURLResponseCSgs5Error_pSgtcfU_ + 2384
    23  App NAme                        0x0000000100a98f3c $S10Foundation4DataVSgSo13NSURLResponseCSgs5Error_pSgIegggg_So6NSDataCSgAGSo7NSErrorCSgIeyByyy_TR + 316
    24  CFNetwork                           0x00000001c513aa00 <redacted> + 32
    25  CFNetwork                           0x00000001c514f1a0 <redacted> + 176
    26  Foundation                          0x00000001c55ed8bc <redacted> + 16
    27  Foundation                          0x00000001c54f5ab8 <redacted> + 72
    28  Foundation                          0x00000001c54f4f8c <redacted> + 740
    29  Foundation                          0x00000001c55ef790 <redacted> + 272
    30  libdispatch.dylib                   0x000000010286f824 _dispatch_call_block_and_release + 24
    31  libdispatch.dylib                   0x0000000102870dc8 _dispatch_client_callout + 16
    32  libdispatch.dylib                   0x00000001028741c4 _dispatch_continuation_pop + 528
    33  libdispatch.dylib                   0x0000000102873604 _dispatch_async_redirect_invoke + 632
    34  libdispatch.dylib                   0x00000001028821dc _dispatch_root_queue_drain + 376
    35  libdispatch.dylib                   0x0000000102882bc8 _dispatch_worker_thread2 + 156
    36  libsystem_pthread.dylib             0x00000001c477917c _pthread_wqthread + 472
    37  libsystem_pthread.dylib             0x00000001c477bcec start_wqthread + 4
)

0

ฉันยังพบปัญหานี้ด้วยการเห็นข้อความเหล่านี้จำนวนมากและร่องรอยสแต็กที่ถูกพิมพ์ในเอาต์พุตเมื่อฉันปรับขนาดหน้าต่างให้มีขนาดเล็กกว่าค่าเริ่มต้น ใช้เวลานานในการหาปัญหาฉันคิดว่าฉันจะแบ่งปันวิธีแก้ปัญหาที่ค่อนข้างง่าย ผมได้เปิดใช้งานครั้งเดียวCan Draw ConcurrentlyบนNSTextViewผ่าน IB ที่บอก AppKit ว่าสามารถเรียกวิธีการดูdraw(_:)จากเธรดอื่น หลังจากปิดใช้งานฉันไม่ได้รับข้อความแสดงข้อผิดพลาดอีกต่อไป ฉันไม่พบปัญหาใด ๆ ก่อนที่จะอัปเดตเป็น macOS 10.14 Beta แต่ในเวลาเดียวกันฉันก็เริ่มแก้ไขรหัสเพื่อให้ทำงานกับมุมมองข้อความได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.