web-dev-qa-db-fra.com

Xcode 8.0 Swift 3.0 lente indexation et construction

J'ai installé Xcode 8.0 et converti Swift 2.2 en 3.0 (ce processus a également pris beaucoup de temps, je viens de laisser mon Mac en marche toute la nuit). Je n'ai pas un gros projet (environ 20 fichiers). J'utilise aussi Pods. L'indexation de la version précédente de Xcode (<8.0) a fonctionné rapidement, mais après la mise à niveau, la barre de progression est bloquée sur une position (j'attends déjà depuis une heure).

Ce que j'ai essayé ne m'a pas aidé:

  • Nettoyé le dossier DerivedData et redémarré Xcode
  • Nettoyé le projet et redémarré Xcode
  • Supprimé le répertoire Pods avec <project>.xcworkspace, puis installé à nouveau
  • Mac redémarré
  • Projet de construction essayé sans Pods
  • Xcode réinstallé
  • Essayé sur un autre Mac avec un projet cloné

Ce n'est vraiment pas cool de faire de telles versions de logiciels lorsque les développeurs doivent passer des heures à résoudre des problèmes aussi ridicules. C'est très décevant ... Des idées pour résoudre ce problème?

60
Danny

J'ai résolu le problème en commentant tous les fichiers, puis en supprimant les commentaires un par un. J'ai trouvé que le problème est toujours dans la déclaration de tableau comme décrit ici .

J'avais un code comme celui-ci et le projet n'était pas indexé:

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]
    }
}

J'ai changé cela et l'indexation a commencé à fonctionner:

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

Accédez aux paramètres du projet, puis à Editeur> Ajouter un paramètre de construction> Ajouter un paramètre défini par l'utilisateur, puis ajoutez les éléments suivants:

Swift_WHOLE_MODULE_OPTIMIZATION = YES

L'ajout de ce drapeau a fait chuter miraculeusement les temps de compilation de notre propre construction de 7 minutes à 65 secondes pour un projet 40KLOC Swift. Vous pouvez également confirmer que 2 amis ont constaté des améliorations similaires sur des projets d’entreprise.

Je ne peux que supposer que ceci est une sorte de bogue dans Xcode 8.0

51
Chris

J'ai le même problème seulement depuis la mise à niveau vers Swift 3/XCode 8 et cela semble être causé par de grands tableaux littéraux.

J'ai pu résoudre le problème en ajoutant des annotations de type aux variables affectées au littéral de tableau, par exemple.

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

au lieu de

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

J'avais un problème similaire et suivais ce guide pour déboguer: http://irace.me/Swift-profiling Mon problème était que j'avais un opérateur de coalescence nul dans certaines chaînes, par exemple:

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

et quatre méthodes avec cela causaient 2 min supplémentaires de temps de construction.

5
Stefan Nestorov

J’ai eu le même problème et je l’ai résolu en parcourant mon code ligne par ligne, il s’avère que Swift 3 préfère l’interpolation des chaînes plutôt que le symbole +, c’est-à-dire 

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

Si vous avez utilisé le style de code ci-dessus, remplacez-le par;

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

Et votre temps de construction reviendra immédiatement à la normale.

4
silly_cone

pour ceux qui veulent trouver où le compilateur est "attrapé"

Ajouter à Other Swift Flags-Xfrontend -warn-long-function-bodies=50

vérifier la réponse complète ici

3
Constantin Saulenco

J'ai essayé les solutions ci-dessus mais le problème persiste. Le débogage fonctionne aussi bizarre. Après quelques jours de recherche, j'ai trouvé la solution ci-dessous. 

Sélectionnez cible principale> Paramètres de construction. Configuration comme image ci-dessous.

 enter image description here

2
Tai Le Anh

J'ai eu une fonction qui a pris plus d'une minute à compiler, et après une enquête, j'ai trouvé que le coupable vérifiait si assez de temps s'était écoulé depuis une date mémorisée:

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
}

La compilation de ce code prend plus de 10 secondes - couplé à la répétition répétée de ce code avec des nombres différents plusieurs fois, la compilation prenait beaucoup trop de temps. J'ai pu résoudre ce problème en pré-calculant l'intervalle

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
}

Après avoir fait cela avec les ~ 10 fois que je vérifiais, le temps de compilation passait de plus d’une minute à quelques millisecondes.

Il est extrêmement probable que ce problème se produise également avec la combinaison de l’inférence de type et des mathématiques ailleurs. Veillez donc à ce que cela ne se produise nulle part ailleurs dans votre code.

1
Jojodmo

Je ne pense pas que cela soit lié au problème d'OP, mais le XCode 8 pour moi a récemment ralenti. J'ai finalement trouvé que c'était mon erreur (et je me souviens de l'avoir fait par inadvertance) - j'ai ajouté XCode.app comme référence Framework. Cela a essentiellement permis à XCode de rechercher et d’indexer l’ensemble du dossier XCode.app. Une fois que j'ai vu l'erreur et enlevé le Framework, il est redevenu bon :)

1
steve

Mon problème était le dictionnaire. J'avais varié grand dictionnaire.

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]

Je l'ai décomposé en:

        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

J'ai rencontré le même problème d'indexation, mais cela ne s'est produit que lorsque j'exécutais/déboguaisais un périphérique, puis basculais vers un autre périphérique dans la barre d'outils en haut à gauche (Cible> iPhone).

Aucune des solutions ci-dessus n'a fonctionné pour moi. 

Ma solution: J'ai enlevé ma copie de travail git locale et en ai cloné une nouvelle à partir de mon "origine".

(Il y a des fichiers "magiques" dans les dossiers xcuserdata/shared/session etc. qui pourraient être à l'origine de ce problème?)

1
Tailz

C'est un bogue Xcode (Xcode 8.2.1) qui se produira si vous avez un littéral de dictionnaire volumineux ou un dictionnaire imbriqué. Vous devez diviser votre dictionnaire en parties plus petites et les ajouter avec la méthode append jusqu'à ce que Apple corrige le bogue.

0
Pink Panther

Cela fonctionne pour moi dans Xcode 8.2.1 et Swift 3 lorsque "l'indexation" est bloquée:

J'ai toujours deux projets ouverts, un projet fictif et le projet sur lequel je travaille. J'ai aussi un appareil iPad Air connecté sur lequel je lance mes projets. Lorsque mon projet est bloqué sur "Indexation", je passe à mon projet factice et le lance sur mon périphérique iPad Air connecté. Ensuite, j’arrête le projet Je reviens au projet sur lequel je travaille et l’indexation est terminée comme par magie. Cela devrait également fonctionner avec le simulateur uniquement, si vous n'avez pas de périphérique physique connecté.

0
ironarrow

Après avoir ajouté le réglage,

Swift_WHOLE_MODULE_OPTIMIZATION = YES

notre projet nettoie les temps de compilation de 1200 à 180 pour 650 fichiers Swift. Mais cela entraînera une augmentation de la compilation. Chaque changement nécessite la compilation de 180 secondes lorsque la compilation supplémentaire ne nécessite que 60 ans. 

0
Suric

Sauvegardez votre projet, supprimez le dernier projet de mise à jour après la sauvegarde, puis redémarrez Xcode simple :-)

0
Shakeel Ahmed