对数组排序时 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩溃

Mik*_*imz 5 arrays sorting xcode ios swift

在对数组进行排序时,我遇到间歇性崩溃,并且无法按需重现它,也无法解决该问题。这是崩溃的情况:

Crashed: com.apple.root.background-qos XC_BAD_ACCESS KERN_INVALID_ADDRESS 0x003400010efebbe8

specialized Array._createNewBuffer(bufferIsUnique:minimumCapacity:growForAppend:) + 4341522208

请参阅下面我认为导致崩溃的代码(我认为这是一个线程问题),我相信它正在发生。任何有关此事的帮助将不胜感激!我已经为这个问题苦苦挣扎了好几天了。如果您需要任何进一步的信息,请告诉我。提前致谢:

func getPopCultureNews(completion: @escaping () -> Void) {
    let group = DispatchGroup()
    
    var items = [NewsItem]()
    
    for feed in NewsManager.shared.popCultureFeedUrls {
        group.enter()
        
        if let feedURL = URL(string: feed) {
            let parser = FeedParser(URL: feedURL)
            parser.parseAsync(queue: .global(qos: .background)) { (result) in
                switch result {
                case .success(let feed):
                    switch feed {
                    case let .atom(feed):
                        if let entries = feed.entries {
                            entries.forEach { (entry) in
                                let item = NewsItem(atomEntry: entry, rssEntry: nil, jsonEntry: nil)
                                if item.hasImage() {
                                    items.append(item)
                                }
                            }
                        }
                    case let .rss(feed):
                        if let entries = feed.items {
                            entries.forEach { (entry) in
                                let item = NewsItem(atomEntry: nil, rssEntry: entry, jsonEntry: nil)
                                if item.hasImage() {
                                    items.append(item)
                                }
                            }
                        }
                    case let .json(feed):
                        if let entries = feed.items {
                            entries.forEach { (entry) in
                                let item = NewsItem(atomEntry: nil, rssEntry: nil, jsonEntry: entry)
                                if item.hasImage() {
                                    items.append(item)
                                }
                            }
                        }
                    }
                case .failure(let error):
                    print(error)
                }
                
                items = items.sorted(by: { $0.getPublishedDate().compare($1.getPublishedDate()) == .orderedDescending })
                group.leave()
            }
        }
    }
    
    group.notify(queue: DispatchQueue.global(qos: .background)) {
        NewsManager.shared.popCultureItems = items
        completion()
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

看起来var items = [NewsItem]()应该是线程安全的。查看此内容以了解更多详细信息在 Swift 中创建线程安全数组

另外,我建议您进行一次排序,例如在 中group.notify,而不是在每次迭代中排序。