首页 > 解决方案 > iOS 更新 14.4.2 后 Swift 中的列表操作问题

问题描述

多年来,我使用这个简单的代码在 Swift 中读取和操作列表:

if (Helper.hasSubscription()) {
                    
                    self.allVisitedTrackHandles = Database.getAllCompletedTrackHandles(withDeleted: false, userid: self.userid)
                    
                    if (self.allVisitedTrackHandles.count > 0) {
                        
                        var counter = 0
                        
                        for th: TrackHandle in self.allTrackHandles {
                            
                            if self.allVisitedTrackHandles.contains(where: { $0.trackid == th.trackid }) {
                                
                                for thv: TrackHandle in self.allVisitedTrackHandles {
                                    
                                    if thv.trackid == th.trackid {
                                        
                                        self.allTrackHandles[counter].date_in_milliseconds = thv.date_in_milliseconds
                                        
                                        break
                                    }
                                    
                                }
                                
                                self.allTrackHandles[counter].visited = 1
                                
                            }
                            
                            
                            counter += 1
                            
                        }
                    }
                }

将我的 iOS 设备更新到 iOS 14.4.2 后,应用程序在此行崩溃:

for th: TrackHandle in self.allTrackHandles

Xcode 给我的唯一反馈是:Thread 79: EXC_BAD_ACCESS (code=1, address=0x12f100010)

标签: iosswift

解决方案


我不知道为什么那条线会突然开始崩溃;显示的代码中没有任何内容会导致崩溃。您是否在其他地方更新阵列?这可能是线程问题吗?

您可以重构此代码,使其更简单、更清晰、更高效。这可能会有所帮助;

if Helper.hasSubscription() {
    self.allVisitedTrackHandles = Database.getAllCompletedTrackHandles(withDeleted: false, userid: self.userid)
    if !self.allVisitedTrackHandles.isEmpty {
    
        for index in 0..<self.allTrackHandles.count {
            if let visited = self.allVisitedTrackHandles.first { $0.track id == self.allTrackHandles[index].track id } {
                self.allTrackHandles[index].date_in_milliseconds = visited.date_in_milliseconds
            }
            self.allTrackHandles[index].visited = 1                        
        }
    }    
}

推荐阅读