SourceKitService占用了高达200%的CPU



我刚刚更新到Xcode 12.5.1,现在每当我编辑特定文件时,我的SourceKitService都会占用我极高的CPU。在编辑这个文件到任何程度后,我的CPU使用率都会飙升,代码完成等基本服务也会停止工作。我已经在网上尝试了关于这个问题的大多数解决方案,但没有任何帮助。有人对此有什么想法吗?谢谢

我将把文件的所有代码都放在这里,因为我不确定问题可能来自哪里。

//
//  ScheduleView.swift
//  ClassWidget
//
//  Created by Ben K on 6/17/21.
//
import SwiftUI
import CoreData
struct ScheduleView: View {
@Environment(.managedObjectContext) var moc

@ObservedObject var schedule: Schedule
@State private var showingAddPeriod = false
@State private var showingEditPeriod = false
@State private var editPeriod: Period?
@State private var isEditMode: EditMode = .inactive

@State private var showingSettings = false
@State private var showingPreview = false

@State private var showingWarning = false
@State private var warningPeriod: Period?

var timeFormatter: DateFormatter {
let formatter = DateFormatter()
formatter.dateStyle = .none
formatter.timeStyle = .short
return formatter
}

var body: some View {
ZStack {
Text("(editPeriod?.uName ?? "")")
.hidden()
List {
Section(header: Text("Classes")) {
if !schedule.periods.isEmpty {
ForEach(schedule.periods) { period in
Button(action: { editPeriod = period; isEditMode = .inactive; showingEditPeriod = true }) {
HStack {
VStack {
Text(timeFormatter.string(from: period.uStart))
Text("to")
Text(timeFormatter.string(from: period.uEnd))
}
.font(.caption)
.padding(.trailing, 10)
.padding(6)

Divider()
.frame(height: 35)
.padding(.trailing)

VStack(alignment: .leading) {
Text(period.uName)

if period.uTeacher != "" && period.uRoom != "" {
Text("(period.uTeacher) • (period.uRoom)")
.font(.caption)
.foregroundColor(.secondary)
} else if period.uTeacher != "" {
Text("(period.uTeacher)")
.font(.caption)
.foregroundColor(.secondary)
} else if period.uRoom != "" {
Text("(period.uRoom)")
.font(.caption)
.foregroundColor(.secondary)
}
}

Spacer()

Image(systemName: "chevron.right")
.renderingMode(.template)
.padding(.trailing, 10)
.opacity(0.5)
}
.foregroundColor(.primary)
}
}
.onDelete(perform: delete)
} else {
VStack(alignment: .leading) {
Text("No classes yet")
.font(.headline)
Text("Start adding classes to create this schedule!")
.font(.caption)
.italic()
}
.padding(8)
}
}

Section {
Button(action: {
showingSettings = true
}) {
HStack {
Text("Settings")
Spacer()
Image(systemName: "chevron.right")
.padding(.trailing, 10)
.opacity(0.5)
}
.foregroundColor(.primary)
}
}

Button("Preview Widget") {
showingPreview = true
}

}
.listStyle(InsetGroupedListStyle())
}
.navigationTitle(schedule.uName)
.navigationBarTitleDisplayMode(.inline)
.navigationBarItems(trailing: Button(action: {
showingAddPeriod = true
}) {
Image(systemName: "plus").padding([.vertical, .leading])
})
.sheet(isPresented: $showingAddPeriod) {
AddPeriod(schedule: schedule)
.environment(.managedObjectContext, self.moc)
}
/*.sheet(isPresented: $showingEditPeriod) {
if let period = editPeriod {
AddPeriod(period: period)
.environment(.managedObjectContext, self.moc)
}
}*/
.fullScreenCover(isPresented: $showingEditPeriod, onDismiss: dismissedSheet) {
if let period = editPeriod {
AddPeriod(period: period)
.environment(.managedObjectContext, self.moc)
}
}
.fullScreenCover(isPresented: $showingSettings) {
ScheduleSettingsView(schedule: schedule)
.environment(.managedObjectContext, self.moc)
}
.sheet(isPresented: $showingPreview) {
PreviewWidget(schedule: schedule)
}
.alert(isPresented: $showingWarning) {
Alert(title: Text("Delete (warningPeriod?.uName ?? "")"), message: Text("Are you sure?"), primaryButton: .destructive(Text("Delete")) {
try? moc.save()
}, secondaryButton: .cancel() {
if let period = warningPeriod {
readdPeriod(period: period)
}
})
}
.environment(.editMode, self.$isEditMode)

}

func delete(at offsets: IndexSet) {
for offset in offsets {
warningPeriod = schedule.periods[offset]
moc.delete(schedule.periods[offset])
showingWarning = true
}
}

func readdPeriod(period: Period) {
let newPeriod = Period(period: period, context: moc)
newPeriod.schedule = schedule
try? moc.save()
}

func dismissedSheet() {
schedule.objectWillChange.send()
}
}

struct ScheduleView_Previews: PreviewProvider {
static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

static var previews: some View {
let schedule = Schedule(name: "Example Schedule", number: 0, context: moc)

NavigationView {
ScheduleView(schedule: schedule)//.preferredColorScheme(.dark)
}
}
}

查看您的代码,似乎有很多事情在进行,但与您在SO、中找到的其他解决方案一起

开始注释掉代码的一部分,试图缩小可能导致它的语法问题,这是很有帮助的

根据评论中的对话,这个问题是由附加到ZStack的多个视图修饰符引起的,将它们移动到激活它们的视图中,到目前为止已经解决了这个问题

这是一个编译器类型检查引擎故障,也称为

编译器无法在合理的时间内对此表达式进行类型检查;尝试将表达式分解为不同的子表达式

由于某种原因,它以静默方式失败,并导致SourceKitService和swift前端泄漏。

您需要通过将视图的逻辑离散部分移动到单独的辅助变量/函数或结构中来简化视图。

最新更新