skip to Main Content

I just updated to Xcode 12.5.1, and now my SourceKitService is taking insanely high amounts of my CPU whenever I edit a specific file. After editing this file to any extent my CPU usage jumps through the roof, and basic services such as code completion stop working. I’ve already tried most of the solutions online about this issue, and nothing is helping. Does anyone have any ideas for this? Thanks.

I’ll just put all of the file’s code in here, because I’m not sure where the issue might originate.

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

2

Answers


  1. Looking at your code there seems to be a lot going on but along with the other solutions you will find in SO,

    It is helpful to start commenting out portions of your code to try and narrow down a syntax issue that might be causing it.

    Per out conversation in the comments the issue was caused by the multiple view modifiers that were attached to your ZStack moving them to the views that activated them has so far resolved it.

    Login or Signup to reply.
  2. This is a compiler type-checking engine failure, aka

    compiler is unable to type-check this expression in reasonable time;
    try breaking up the expression into distinct sub-expressions

    For some reason it fails silently and causes SourceKitService and swift-frontend to leak.

    You need to simplify you view by moving logically discrete parts of the view into separate helper vars/funcs or structs.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search