2017-09-22 24 views
15

Tôi đang cố gắng hiển thị một số chế độ xem trong một chuỗi riêng biệt để không ảnh hưởng đến chuỗi chính. Đó không bao giờ là vấn đề trước Xcode 9. Bây giờ các bài kiểm tra đơn vị của tôi bị hỏng ở đây.Xcode 9 [UIView initWithFrame:] phải được sử dụng từ chủ đề chính chỉ

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    UIImage *snapShot = [self generateShadowImage]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     imageView.image = snapShot; 
    }); 
}); 

... 

- (UIImage *)generateShadowImage { 

    // It crashes here: 
    UIView *shadowView = [[UIView alloc] initWithFrame:CGRectZero]; 
    ... 
} 

Tại sao tôi không thể hiển thị các phần tử giao diện người dùng để sử dụng sau này trong một chủ đề không phải là chuỗi chính?

+0

Tôi đã biết quy tắc mới này, nhưng tôi tự hỏi có bao nhiêu công việc bạn vẫn có thể tải xuống một chuỗi backgroudn ... –

Trả lời

14

XCode 9 có thời gian chạy mới Main Thread Checker phát hiện cuộc gọi đến UIKit từ chuỗi nền và tạo cảnh báo.

Tôi biết nó có nghĩa là tạo cảnh báo và không làm hỏng ứng dụng, nhưng bạn có thể thử tắt Trình kiểm tra chuỗi chính cho mục tiêu thử nghiệm của mình.

enter image description here

Tôi đã thử mã này trong một dự án mẫu, debugger dừng lại ở vấn đề này (vì nó là vụ phải), nhưng các ứng dụng đã không sụp đổ.

override func viewDidLoad() { 
    super.viewDidLoad() 

    DispatchQueue.global().async { 
     let v = UIView(frame: .zero) 
    } 
} 
+1

Điều đó đã làm ngay bây giờ. Cảm ơn! – lukwuerz

+0

Trong trường hợp của tôi, tôi đã gọi một phương thức từ trong yêu cầu URLSession. –

1

Bạn có thể sử dụng chức năng này

func downloadImage(urlstr: String, imageView: UIImageView) { 
    let url = URL(string: urlstr)! 
    let task = URLSession.shared.dataTask(with: url) { data, _, _ in 
     guard let data = data else { return } 
     DispatchQueue.main.async { // Make sure you're on the main thread here 
      imageview.image = UIImage(data: data) 
     } 
    } 
    task.resume() 
} 

Làm thế nào để sử dụng chức năng này?

downloadImage(urlstr: "imageUrl", imageView: self.myImageView) 
Các vấn đề liên quan