web-dev-qa-db-fra.com

Swift Index de Xcode gelé ou lent

Peut-être que c'est juste moi qui expérimente une "fonctionnalité" aussi ennuyeuse:

Après la mise à niveau de Xcode 6.0.1 vers Xcode 6.1, les choses ont changé. Xcode 6.1 indexe en permanence le projet ou compile les fichiers source. Le projet n'est pas énorme. Il contient juste un tas de fichiers Swift et de cocoapods AWS SDK 2.0 dans l’espace de travail. Je ne pense pas que cela devrait empêcher l’ensemble d’indexer et de compiler sans problème. J'ai essayé avec aws-sdk- ios-samples, juste pour voir comment Xcode 6.1 fonctionne sur eux, et il finit toujours par attendre.

Quelles solutions j'ai essayé jusqu'à présent:

  1. Suppression des "données dérivées" dans l’organiseur, puis réouverture et espace de travail. (ne pas réparer)
  2. "Afficher le contenu du paquet" sur le fichier .xcodeproj et supprimer .xcworkspace comme dans ( Xcode 4 - performances lentes )

Aucun d'entre eux n'a fonctionné, malheureusement.

P.S. peut-être que je devrais essayer de recréer le projet? Paramètres de l'ordinateur: MacBook Pro (Retina, 13 pouces, milieu 2014), mémoire 8 Go 1600 MHz DDR3, avec Yosemite. (Je pense que cela suffit pour exécuter ce petit projet.)

99
leonard

J'ai essayé la plupart des suggestions ci-dessus, notamment la division de fichiers, l'installation de Xcode 6.2 bêta et la suppression des instructions de concaténation de chaînes. Ce qui a finalement été fait pour moi a été de scinder un tableau de dictionnaires de déclarations littérales que j'utilisais pour les données de test en plusieurs .append déclarations.

// This causes indexing/building to hang...
var test = [ [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ] ]

// This works fine.
var test = [ [ "a": false, "b": "c" ] ]
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])

Aussi, pour ce que ça vaut, la 6ème entrée de ce tableau est la cause du problème pour moi; cinq fonctionne très bien.

72
Zen

La seule solution qui fonctionne pour moi est de supprimer toutes les données dérivées (pas seulement pour le projet en cours, il suffit de nettoyer tout le dossier), puis de redémarrer Xcode.

  1. Ouvrir un fichier/préférences dans Xcode

  2. Cliquez sur Emplacements à l'extrême droite de la fenêtre contextuelle.

  3. Cliquez sur la petite icône en forme de flèche à côté de "/Users/Mac/Library/Developer/Xcode/DerivedData"....it" pour accéder à un dossier Xcode contenant un dossier DerivedData (contenant toutes les données dérivées de vos projets précédents.). .)

  4. SUPPRIME le dossier DerivedData

34
Remy Cilia

Utilisez-vous CocoaPods? J'ai rencontré le même problème plus tôt aujourd'hui. (Utilisation de xCode 6.1.1)

Pour résoudre le problème, j'ai tout supprimé dans ~/Library/Developer/Xcode/DerivedData, le dossier Pods dans le répertoire de mon projet et <project>.xcworkspace.

J'ai ensuite ouvert le terminal, accédé au répertoire de mon projet et exécuté pod install encore.

11
Michael Schinis

Avait le même problème aujourd'hui. Xcode 6.3.2, moyen Swift. À un moment donné, il a commencé à indexer et ne finissait jamais l'indexation. Le code à l'origine de cette opération était un dictionnaire de type [String: [String]] Ainsi, un dict-string avec des tableaux de chaînes en tant que valeurs, j’en ai deux avec les clés de A à Z et chacune de ces 26 entrées contient un tableau de chaînes de 5 à 10 chaînes.

La suppression des données dérivées n’a pas aidé. Seulement commenter ces dict fait que ça aille encore.

Honnêtement, c'est ridicule! Apple a besoin de réparer Xcode! C’est déjà horriblement lent lors de la compilation Swift des projets, mais des bugs comme celui-ci sont un casse-tête. Je ne peux pas faire mon travail correctement avec cela !

8
BadmintonCat

Pour ceux qui ont toujours ce problème, voici une solution de contournement dont je me suis régalée, qui vous évite d'avoir à entrer les objets un par un:

// instead of this, which freezes indexing
let keys = [keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM]    

// and instead of this, which is ugly & lengthy
var keys = [KeyboardKey]()
keys.append(keyQ)
keys.append(keyW)
...
keys.append(keyM)

// use this:
var keys = [KeyboardKey]()
keys.appendContentsOf([keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM])
6
Andrew Robinson

Pour moi, j'ai essayé tout ce qui précède sans succès; mais tout ce que j'avais à faire était de supprimer le dossier de données dérivé, puis d'ouvrir un autre projet aléatoire, d'attendre qu'il soit indexé et maintenant mon projet d'origine (dysfonctionnel) fonctionne!

Faites une faveur au monde du développement Apple) et créez votre compilateur Swift en open source) pour que nous ne soyons pas tous contrariés par votre incompétence.

4
Gmeister4

J'utilise Xcode Version 7.3 (7D175)

Je pense que j'aurais pu comprendre un problème sous-jacent. Voici deux cas où je me suis retrouvé coincé dans la phase d’indexation:

  • J'ai créé une fermeture que j'ai affectée à une variable et omis la signature de type. Je pense que xcode a eu des problèmes avec cette étape d'inférence de type. Si je me souviens bien, l'un des arguments était un CGPoint, dont le constructeur était surchargé. Mon hypothèse est qu'il y a trop de possibilités de ce que ma fermeture pourrait accepter comme arguments.

  • J'ai refactoré une méthode fabrique de telle sorte qu'au lieu de renvoyer des instances d'un type, elle pourrait renvoyer des instances de nombreux types avec une classe de base commune. Il semble que chaque fois que j'utilisais la méthode factory, je devais convertir l'objet résultant en un type spécifique (soit avec?, Soit en l'attribuant à une variable qui accepte un type spécifique). Là encore, l'étape d'inférence de type semble être interrompue.

Il semble que la même chose se passe avec les déclarations de dictionnaire mentionnées par des personnes antérieures. J'ai déposé un rapport de bogue avec Apple.

3
DudeOnRock

J'ai lutté avec le même problème. J'ai essayé les deux solutions mentionnées (supprimer les données dérivées et supprimer .xcworkspace) sans succès. J'ai aussi essayé de commenter lentement la plupart du code peu à peu et de supprimer les fichiers jusqu'à ce qu'il ne reste presque plus rien et que l'indexation soit toujours bloquée.

J'ai trouvé une solution qui fonctionnait pour moi. J'ai ouvert le projet avec une ancienne version de Xcode 6.1 (6A1030) qui n'avait pas de problème d'indexation, puis je suis retournée à la dernière version de Xcode 6.1 (6A1052d) que j'utilisais auparavant et qui était indexée. fixe et a continué à bien fonctionner.

Ma conclusion est qu’il s’agit d’un bogue de Xcode version 6.1 (6A1052d) qui, j’espère, s’améliorera avec les versions futures.

Le problème revient de temps en temps, le même correctif fonctionne à chaque fois. J'imagine qu'une autre solution consisterait simplement à conserver l'ancienne version de Xcode 6.1 (6A1030), mais cela ne fonctionnerait pas avec les appareils exécutant iOS 8.1 et les correctifs de bogues les plus récents.

2
Jorge Costa

J'ai rencontré le même problème après la mise à niveau vers la version 6.1. Xcode serait bloqué lors de la compilation ou de l'indexation sans générer de message d'erreur spécifique.

Le problème a finalement été résolu en divisant certaines des expressions les plus longues des fichiers Swift en plusieurs expressions plus courtes. Une partie de mon programme combine de nombreuses variables de chaîne différentes pour former une chaîne plus longue. Tentatives de les combiner. dans une seule expression et en utilisant l'opérateur d'affectation d'addition, les deux ont échoué.

var a = "Hello"
var b = " "
var c = "World"
var d = "!"
var partA = a + b
var partB = c + d
var result = partA + partB

J'ai eu cette idée en recevant à plusieurs reprises l'erreur suivante dans la version précédente de Xcode "L'expression était trop complexe pour être résolue dans un délai raisonnable; envisagez de diviser l'expression en sous-expressions distinctes."

J'espère que cela t'aides

2
Adam137

Sur mon Xcode, la solution consistait à fermer toutes les fenêtres redondantes. Pour une raison quelconque, de nombreuses fenêtres ouvertes rendent XCode très lent.

1
Arik Halperin

L'indexation Xcode pour votre code pour les suggestions et l'auto-complétion, entre autres choses, comme vous aider dans les story-boards et vice-versa. Mais pour accélérer votre projet xcode, vous pouvez l’activer/désactiver via un terminal

Désactiver l'indexation
par défaut write com.Apple.dt.XCode IDEIndexDisable 1 Activer les valeurs d'indexation par défaut write com.Apple.dt.XCode IDEIndexDisable 0

Mais Mieux vaut utiliser un Mac rapide avec une bonne mémoire vive.

1
Ballu

J'ai essayé cela avec Xcode 8.3.3. Voici mes résultats:

Vous pouvez écrire parfaitement bien Swift) code qui entraînera le blocage de l'indexation.

Une fois que l'indexation se bloque, il se bloque. Remettre le code Swift en quelque chose qui ne causerait pas le blocage de l'indexation n'aide pas, il reste bloqué.

Fermer le projet et rouvrir ne sert à rien dans cette situation.

Quitter Xcode et le redémarrer aide. L'indexation ne sera plus bloquée (c'est-à-dire si vous modifiez le code pour qu'il ne soit plus bloqué).

Redémarrer votre Mac est également utile, bien que cela ne soit pas nécessaire.

La suspension est due à un code parfaitement correct Swift. Un exemple auquel j'avais ressemblé

if let date = function1()
?? function2()
?? function3()
?? function4()
?? function5()
?? function6()
?? function7()
?? function8()
?? function9()
?? function10() {
    return date
}

L'indexation serait suspendue. J'ai commenté la plupart des "??" et c’était bien (après avoir quitté et relancé Xcode). Décommentée une ligne après l'autre. Avec un certain nombre de lignes, tout allait bien. Si vous supprimiez la mise en commentaire de la ligne suivante, le message était suspendu.

La seule chose qui aide apparemment change votre code.

1
gnasher729

Finalement, j'ai "résolu" le problème, même s'il ne s'agit que d'une solution de contournement.

J'ai créé un autre projet et ajouté des fichiers un par un. Ensuite, j'ai repéré un "très long" fichier viewcontroller.Swift. Ensuite, j'ai cassé ses codes en modules et transformé les codes utilisés de manière répétée en fonctions d'un autre fichier Swift. Et j'ai également suggéré en ligne que l'expression longue soit divisée en fichiers plus courts. Ensuite, travaux d'indexation et de compilation.

Donc pour l'instant, je l'ai "résolu".

MAIS, je ne pense pas que ce soit juste. Xcode IDE devrait être plus que capable de gérer mon fichier "très long" Swift, seulement 1500 lignes. Je crois que c'est définitivement un bogue (existant pour une longtemps), bien que Xcode 6.1 soit déjà une mise à niveau de Xcode 6.0.1.

1
leonard

Pour moi, j'ai supprimé l'application Xcode, je l'ai téléchargée à nouveau et je l'ai installée. Cela a résolu le problème, du moins maintenant.

1
Tzegenos

Vous voudrez peut-être mettre à jour vers Xcode 6.1.1

Il a été officiellement publié et résolu pour nous le problème d'indexation. Dans la description de la mise à jour, il est indiqué qu'ils ont appliqué des correctifs de stabilité. Il est donc très probable que le comportement sera plus stable.

Je vous souhaite bonne chance avec cette saga!

0
Angel Naydenov

Je vois ceci dans Xcode 6.3.2. J'avais vraiment espéré qu'un an après leur sortie, le compilateur fonctionnerait, mais hélas.

Si aucune des solutions ci-dessus ne fonctionne, essayez de rechercher des erreurs de syntaxe dans votre code. Dans le processus de refactorisation, j'ai extrait une fermeture mais j'ai oublié de qualifier les paramètres:

    let hangsInsteadOfError = { l, r in
        return l.nameFirst < r.nameFirst
        || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

    let fixingErrorAvoidsHang = { (l:User, r:User) -> Bool in
        return l.nameFirst < r.nameFirst
            || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

Si j'ai appris quelque chose en travaillant dans Swift, c'est pour travailler progressivement, pour éviter d'avoir à trop revenir en arrière pour trouver le code incriminé.

0
Chris Conover

J'utilise Xcode 6.1.1 avec des fichiers Swift sur le même MacBook Pro exact.

Alors que je continuais à ajouter des lignes dans un tableau de chaînes 3D, Xcode est devenu soudainement inutilisable et maintenant je ne peux plus rien faire.

Je vais essayer de revenir à la version 6.1 et espérer que le problème disparaîtra.

0
gardner888

J'ai également eu ce problème et je l'ai résolu en supprimant/modifiant les expressions avec l'opérateur "+".

Je jure de changer ceci:

var mainArray = arrayOne + arrayTwo + arrayThree + arrayFour + arrayFive

Pour ça:

var mainArray = arrayOne
mainArray += arrayTwo
mainArray += arrayThree
mainArray += arrayFour
mainArray += arrayFive

résolu le problème. Je me rends compte que ça a l'air fou mais c'était vrai pour moi.

Ma machine est un MBP au maximum fin 2013

0
Casey Laris

Si cela ne vous dérange pas de revenir à la version 6.0.1 jusqu'à ce qu'ils aient compris, c'est ce qui a fonctionné pour moi. J'avais le même problème avec 6.1 et 6.1.1. Maintenant je vais bien. Je vais essayer la version 6.2 quand elle sortira.

Vous pouvez trouver les versions précédentes du logiciel Apple sur leur site de développement officiel, ici: https://developer.Apple.com/downloads/index.action

Si vous le faites, assurez-vous d’abord de supprimer votre copie actuelle de Xcode.

0
JeremyGranger

La version bêta de Xcode 6.2 a résolu le problème pour moi. Pas rapide comme l'éclair, mais au moins ce n'est pas l'indexation pour toujours. La version bêta est pas installée par-dessus votre installation Xcode habituelle. Si vous n'aimez pas la version bêta, vous pouvez simplement la supprimer.

Divers téléchargements Xcode, y compris la version bêta>

0
Warren Whipple

J'avais le même problème. Mon xCode est 8.2.1. Mais dans mon cas, je voulais créer un tableau de dictionnaire avec 33 paires clé-valeur. Je faisais de la manière suivante qui était bloquée dans l'indexation:

  var parameter = [String : AnyObject]()
  var finalArray = [parameter]

  for item in listArray
  {
       parameter = ["A": item.a as AnyObject, "B": item.b as AnyObject, "C": item.c as AnyObject, ... , "Z": item.z as AnyObject]

       finalArray.append(parameter)

  }

La suite a fonctionné pour moi:

var parameter = [String : AnyObject]()
var finalArray = [parameter]

for item in listArray

{
        parameter["A"] = listArray.a as AnyObject
        parameter["B"] = listArray.b as AnyObject
        parameter["C"] = listArray.c as AnyObject
        parameter["D"] = listArray.d as AnyObject 
        .
        .
        .
        parameter["Z"] = listArray.z as AnyObject 

        finalArray.append(parameter)

}
0
Trup

J'utilise Xcode 8.2 et a également abouti à ce problème. Cela a commencé après que j'ai défini une variable Tuple complexe - un tableau de Tuple avec un sous-tableau de Tuple. Les choses deviennent vraiment lentes lorsque le sous-tableau de Tuple a une propriété calculée par programme.

Comme d'autres réponses l'ont fait remarquer, l'indexation prend une éternité et je crois qu'elle tente d'inférer les types de la variable.

J'ai d'abord résolu le problème en définissant clairement la variable avec les types inclus. Lors de la mise à jour de la propriété, je la calcule d'abord, puis l'assigne au tuple, au lieu de calculer dans la définition de la variable.

Voici un exemple de code.

var sectionTuples: [(section: String, rows: [(name: String, subtitle: String)])] = []
let subtitle1: String = "" // something calculated dynamically
let subtitle2: String = "" // something calculated dynamically
sectionTuples = [(
section: "Section 1", rows: [
(name: "name1", subtitle: subtitle1),
(name: "name2", subtitle: subtitle2)
])]

En bout de ligne, ne laissez pas Xcode déduire des structures complexes.

0
Q Liu
  1. Votre statut d'indexation est-il un "cercle d'indicateur" ou une "barre de progression"?
  2. S'il s'agit d'un "cercle d'indicateur", cela signifie qu'il est déjà bloqué au début.
  3. Ouvrez et vérifiez avec vos autres projets. S'ils sont tous identiques, cela signifie que c'est un problème système.
  4. Il suffit de redémarrer votre ordinateur et tout ira bien.
0
Weidian Huang