it-swarm.com.de

Xcode 8.0 Swift 3.0 langsames Indexieren und Erstellen

Ich habe Xcode 8.0 installiert und Swift 2.2 auf 3.0 konvertiert (dieser Vorgang hat auch viel Zeit in Anspruch genommen, ich habe meinen Mac die ganze Nacht laufen gelassen). Ich habe kein großes Projekt (ca. 20 Dateien). Ich benutze auch Pods. Die Indexierung der vorherigen Xcode-Version (<8.0) hat sich schnell bewährt, aber nach dem Upgrade hängt die Fortschrittsleiste an einer Position (ich warte bereits auf eine Stunde).

Dinge, die ich ausprobiert habe, haben mir nicht geholfen:

  • Der DerivedData-Ordner wurde gesäubert und der Xcode neu gestartet
  • Das Projekt wurde gesäubert und Xcode neu gestartet
  • Pods-Verzeichnis mit <project>.xcworkspace gelöscht und dann erneut installiert
  • Neustart des Mac
  • Versuchte Build-Projekt ohne Pods
  • Xcode neu installiert
  • Versucht auf einem anderen Mac mit geklontem Projekt

Es ist wirklich nicht cool, solche Softwareversionen zu erstellen, wenn Entwickler Stunden damit verbringen müssen, solche lächerlichen Probleme zu lösen. Es ist sehr enttäuschend ... Irgendwelche Ideen, wie man das beheben kann?

60
Danny

Ich löste das Problem, indem ich alle Dateien kommentierte und Kommentare nacheinander entfernte. Ich habe festgestellt, dass das Problem immer noch in der Arraydeklaration wie hier beschrieben ist.

Ich hatte einen solchen Code und das Projekt indizierte nicht:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first, second, third, fourth, fifth]
    }
}

Ich habe es geändert und die Indizierung funktionierte:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first]

        array.append(second)
        array.append(third)
        array.append(fourth)
        array.append(fifth)
    }
}
24
Danny

Gehen Sie zu den Projekteinstellungen und dann zu Editor> Build-Einstellungen hinzufügen> Benutzerdefinierte Einstellungen hinzufügen. Fügen Sie Folgendes hinzu:

Swift_WHOLE_MODULE_OPTIMIZATION = YES

Durch das Hinzufügen dieses Kennzeichens fielen unsere sauberen Kompilierzeiten für ein 40KLOC Swift-Projekt auf wundersame Weise von 7 Minuten auf 65 Sekunden. Außerdem kann bestätigt werden, dass 2 Freunde ähnliche Verbesserungen bei Unternehmensprojekten gesehen haben.

Ich kann nur annehmen, dass dies eine Art Fehler in Xcode 8.0 ist

51
Chris

Ich hatte das gleiche Problem erst seit dem Upgrade auf Swift 3/XCode 8 und scheint auf große Array-Literale zurückzuführen zu sein.

Ich konnte das Problem beheben, indem ich den Variablen, die dem Arrayliteral zugewiesen wurden, Typanmerkungen hinzufügte, z.

let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]

anstatt

let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
6
Ben Simon

Ich hatte ein ähnliches Problem und folgte dieser Anleitung zum Debuggen: http://irace.me/Swift-profiling Mein Problem war, dass ich in einigen Strings keinen Koaleszenzoperator hatte:

let name = "\(someString ?? "")"

und vier Methoden führten zu einer zusätzlichen Bauzeit von 2 Minuten.

5
Stefan Nestorov

Ich hatte das gleiche Problem und löste es, indem ich mühsam meinen Code Zeile für Zeile durchging. Es stellt sich heraus, dass Swift 3 die Interpolation von Strings bevorzugt, anstatt das Symbol + zu verwenden, d. H. 

let url = "http://yahoo.com" + "someWebPage" + "whereItsInteresting" 

Wenn Sie den obigen Code verwendet haben, ersetzen Sie ihn durch;

let url = "http://yahoo.com\(someWebPage)\(whereItsInteresting)"

Und Ihre Bauzeit wird sofort wieder normal sein.

4
silly_cone

für diejenigen, die herausfinden wollen, wo der Compiler "erwischt" wird

Zu Other Swift Flags hinzufügen -Xfrontend -warn-long-function-bodies=50

vollständige Antwort prüfen hier

3

Ich habe die obigen Lösungen ausprobiert, aber das Problem tritt immer noch auf. Das Debuggen funktioniert auch komisch. Nach einigen Recherchen fand ich die Lösung unten. 

Wählen Sie Hauptziel> Build-Einstellungen. Konfiguration als Bild unten.

 enter image description here

2
Tai Le Anh

Ich hatte eine Funktion, die mehr als eine Minute zum Kompilieren brauchte, und nach einiger Untersuchung stellte ich fest, dass der Übeltäter nach einem gespeicherten Datum gesucht hatte, ob genug Zeit vergangen war:

let myStoredDate: Double = // Double representing a time in the past

// if at least one week (60 * 60 * 24 * 7 seconds) has passed since myStoredDate
if Date().timeIntervalSince1970 - myStoredDate > (60 * 60 * 24 * 7){
    // do stuff
}

Die Kompilierung dieses Codes würde über 10 Sekunden dauern. Wenn dieser Code mehrmals mit verschiedenen Nummern wiederholt wird, dauert die Kompilierung viel zu lange. Ich konnte dies durch Vorberechnung des Intervalls beheben

let myStoredDate = // Double representing a time in the past

//it is important to explicitly specify that the variable is a Double
let interval: Double = 60 * 60 * 24 * 7

if Date().timeIntervalSince1970 - myStoredDate > interval{
    // do stuff
}

Nachdem ich dies bei den ca. 10-maligen Überprüfungen gemacht hatte, wurde die Kompilierzeit von über einer Minute auf wenige Millisekunden reduziert.

Es ist sehr wahrscheinlich, dass dieses Problem auch bei der Kombination von Typinferenz und Mathematik an anderer Stelle auftritt. Stellen Sie also sicher, dass an keiner anderen Stelle Ihres Codes so etwas passiert.

1
Jojodmo

Ich glaube nicht, dass dies mit OPs Thema zusammenhängt, aber XCode 8 ist für mich kürzlich zum Stillstand gekommen. Ich fand schließlich, dass es mein Fehler war (und ich erinnere mich, dass ich es versehentlich getan habe) - ich habe XCode.app als Referenz für das Framework hinzugefügt. Dies führte im Wesentlichen dazu, dass XCode den gesamten Ordner XCode.app durchsucht und indiziert. Sobald ich den Fehler sah und das Framework entfernte, kam es wieder gut :)

1
steve

Mein Problem war das Wörterbuch. Ich hatte ein großes Wörterbuch.

let values = ["address":addressTextField.text,"city":cityTextField.text,"zipCode":zipCodeTextField.text,"state":stateTextField.text,"pet":answerLabel.text,"rentStart":rentStartTextField.text,"rentEnd":rentEndTextField.text,"rent":rentTextField.text,"phone":phoneTextField.text,"email":emailTextField.text,"status":leaseStatusTextField.text,"bedrooms":bedroomTextField.text,"parking":parkingLabel.text,"furnish":furnishLabel.text,"utilities":utilitiesTextField.text,"laundry":laundryTextField.text,"paymentCycle":paymentCycleTextField.text,"note":noteTextView.text]

Ich habe es aufgeschlüsselt zu:

        var values = ["address":addressTextField.text]
        values["city"] = cityTextField.text
        values["zipCode"] = zipCodeTextField.text
        values["state"] = stateTextField.text
        values["pet"] = answerLabel.text
        values["rentStart"] = rentStartTextField.text
        values["rentEnd"] = rentEndTextField.text
        values["rent"] = rentTextField.text
        values["phone"] = phoneTextField.text
        values["email"] = emailTextField.text
        values["status"] = leaseStatusTextField.text
        values["bedrooms"] = bedroomTextField.text
        values["parking"] = parkingLabel.text
        values["furnish"] = furnishLabel.text
        values["utilities"] = utilitiesTextField.text
        values["laundry"] = laundryTextField.text
        values["paymentCycle"] = paymentCycleTextField.text
        values["note"] = noteTextView.text
        values["owner"] = userID
1
Ahmadiah

Ich hatte das gleiche Indizierungsproblem. Es trat jedoch nur auf, wenn ich auf einem Gerät ausgeführt/debuggen und dann zu einem anderen Gerät in der oberen linken Werkzeugleiste (Ziel> iPhone) gewechselt bin.

Keine der oben genannten Lösungen hat für mich funktioniert. 

Meine Lösung: Ich habe meine Arbeitskopie entfernt und eine neue aus meinem 'Origin' geklont.

(In den Ordnern xcuserdata/shared/session usw. befinden sich einige "magische" Dateien, die dieses Problem verursacht haben können.)

1
Tailz

Es handelt sich um einen Xcode-Fehler (Xcode 8.2.1). Dieser Fehler tritt auf, wenn Sie ein großes Wörterbuchliteral oder ein verschachteltes Wörterbuchliteral haben. Sie müssen Ihr Wörterbuch in kleinere Teile aufteilen und mit der Anfügemethode hinzufügen, bis Apple den Fehler behoben hat.

0
Pink Panther

Dies funktioniert für mich in Xcode 8.2.1 und Swift 3, wenn "Indexing" feststeckt:

Ich habe immer zwei Projekte offen, ein Dummy-Projekt und das Projekt, an dem ich arbeite. Ich habe auch ein iPad Air-Gerät angeschlossen, auf dem ich meine Projekte ausführen kann. Wenn mein Projekt beim "Indexieren" hängen bleibt, wechsle ich zu meinem Dummy-Projekt und führe mein Projekt auf meinem angeschlossenen iPad Air-Gerät aus. Dann stoppe ich das Projekt Und wechsle wieder zu dem Projekt, an dem ich gerade arbeite, und die "Indizierung" ist magisch abgeschlossen. Dies sollte auch nur mit dem Simulator funktionieren, wenn kein physikalisches Gerät angeschlossen ist.

0
ironarrow

Nachdem Sie die Einstellung hinzugefügt haben,

Swift_WHOLE_MODULE_OPTIMIZATION = YES

unser Projekt erstellt kompilierte Zeiten von 1200 bis 180 für 650 Swift-Dateien. Dies führt jedoch zu einem Fehler beim Kompilieren. Für jede Änderung sind 180s zum Kompilieren erforderlich, wenn das Erhöhen der Kompilierung nur 60s erfordert 

0
Suric

Sichern Sie Ihr Projekt, löschen Sie das letzte Update-Projekt nach dem Sichern und starten Sie Xcode dann einfach neu :-)

0
Shakeel Ahmed