2017-09-22 10 views
15

का उपयोग किया जाना चाहिए, मैं मुख्य धागे को प्रभावित नहीं करने के लिए एक अलग थ्रेड में कुछ दृश्य प्रस्तुत करने का प्रयास कर रहा हूं। एक्सकोड 9 से पहले कभी समस्या नहीं थी। अब मेरी इकाई यहां दुर्घटनाग्रस्त हो गई है।एक्सकोड 9 [UIView initWithFrame:] मुख्य थ्रेड से केवल

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]; 
    ... 
} 

मुझे मुख्य थ्रेड के अलावा किसी थ्रेड में बाद में उपयोग के लिए यूआई तत्वों को प्रस्तुत करने में सक्षम क्यों नहीं होना चाहिए?

+0

मैं इस नए नियम के बारे में पता था, लेकिन मुझे आश्चर्य है कि आप अभी भी एक backgroudn धागा ... –

उत्तर

14

एक्सकोड 9 में एक नया रनटाइम Main Thread Checker है जो पृष्ठभूमि थ्रेड से UIKit को कॉल का पता लगाता है और चेतावनियां उत्पन्न करता है।

मुझे पता है कि चेतावनी उत्पन्न करने और ऐप को क्रैश नहीं करने के लिए इसका मतलब है, लेकिन आप अपने परीक्षण लक्ष्य के लिए मुख्य थ्रेड चेकर को अक्षम करने का प्रयास कर सकते हैं।

enter image description here

मैं एक नमूना परियोजना में इस कोड, डिबगर मुद्दे पर रुका हुआ है (के रूप में यह माना जाता है) की कोशिश की, लेकिन एप्लिकेशन दुर्घटना नहीं किया।

override func viewDidLoad() { 
    super.viewDidLoad() 

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

अभी के लिए किया था के लिए ऑफलोड सकते हैं कि कैसे काम के ज्यादा। धन्यवाद! – lukwuerz

+0

मेरे मामले में मैं URLSession अनुरोध के भीतर से एक विधि बुला रहा था। –

1

आप इस समारोह

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() 
} 

इस सुविधा का उपयोग करने के लिए कैसे उपयोग कर सकते हैं?

downloadImage(urlstr: "imageUrl", imageView: self.myImageView) 
संबंधित मुद्दे