Замораживание индекса Swift Xcode или медленное


101

Может это просто меня так раздражает "особенность":

После обновления с Xcode 6.0.1 до Xcode 6.1 все изменилось. Xcode 6.1 постоянно индексирует проект или компилирует исходные файлы. Проект небольшой. Он просто содержит кучу файлов Swift и AWS SDK 2.0 Cocoapods в рабочей области. Я не думаю, что это должно препятствовать плавной индексации и компиляции всего. Я попробовал с некоторыми aws-sdk-ios-samples, просто чтобы увидеть, как Xcode 6.1 работает с ними, и это закончилось тем же вечным ожиданием.

Какие решения я пробовал до сих пор:

  1. Удаление «Производных данных» в Организаторе и повторное открытие рабочего пространства. (не исправить)
  2. «Показать содержимое пакета» в файле .xcodeproj и удалить .xcworkspace, как в ( Xcode 4 - низкая производительность )

К сожалению, ни один из них не работал.

PS может стоит попробовать воссоздать проект? Настройки моего компьютера: MacBook Pro (Retina, 13 дюймов, середина 2014 г.), память 8 ГБ, 1600 МГц, DDR3, с Yosemite. (Думаю, этого достаточно для запуска этого небольшого проекта.)


Подобные опыты? Да: Xcode beta 3 Swift indexing навсегда
zisoft

2
Я не буду сильно помогать, но то, что я делаю, это ... Я просто позволяю xcode 6.x взять свое время. Если я буду бороться с этим, это сильно меня затянет, поэтому я просто жду запуска xcode 6. Я дал запустить его тупую индексацию. Затем я запускаю симулятор iOS отдельно и жду, пока не появится тупой трамплин. Наконец, когда я запускаю проект, я упускаю из виду тот факт, что много раз при индексировании появляется сообщение «Приостановлено», и я молюсь <# godObject #>, выпиваю кофе и пытаюсь войти в режим дзен. Но * вздох *, это грубо: / и мне очень понравился xcode 5.1.1: |
staticVoidMan

Этот ответ сработал для меня: stackoverflow.com/a/33395844/242933
ma11hew28

Ответы:


72

Я попробовал многие из приведенных выше предложений, включая разделение файлов, установку бета-версии Xcode 6.2 и нарушение операторов конкатенации строк. Что в конечном итоге сделало это для меня, так это разделение массива объявлений литералов словарей, которые я использовал для тестовых данных, на несколько .appendоператоров.

// 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" ])

Кроме того, как бы то ни было, 6-я запись в этом массиве вызывает у меня проблему; пять работает нормально.


То же решение сработало для меня со словарем. Его инициализация напрямую вызвала постоянное выполнение индексации. init()Пошаговая инициализация работает отлично. Стоит отметить, что мне тоже пришлось удалить .xcworkspaceфайл.
jboi

Исправлено это для меня без задействования словарей. Просто массив кортежей, который устраивал 8 элементов в объявлении. Пришлось вернуться к добавлению с 11 элементами. Не удосужился найти точную точку разрыва, но строит в 10 раз быстрее. Xcode версии 6.1.1 (6A2008a) на Mavericks.
Джош

Я также затронул проблему ровно с 6 элементами. 5 было нормально.
Джастин Лау

Это проблема XCode или проблема компилятора?
Sljux 03

4
Я испытал это в Xcode 7.3 с литералом массива из 229 элементов. Вместо того, чтобы разбивать его, я добавил объявление типа вместо того, чтобы позволить Swift определять тип. После того, как я это сделал, все заработало.
Бригам,

34

Единственное рабочее решение для меня - удалить все производные данные (не только для текущего проекта, просто очистить всю папку), а затем перезапустить Xcode.

  1. Открыть файл / настройки в Xcode

  2. Нажмите «Места» в правом углу всплывающего окна.

  3. Щелкните значок маленькой стрелки рядом с «/Users/Mac/Library/Developer/Xcode/DerivedData». Это приведет вас к папке Xcode, которая содержит папку DerivedData (которая содержит все производные данные из ваших предыдущих проектов. .)

  4. УДАЛИТЬ папку DerivedData


1
@TravisM. Вы следовали инструкциям? Если вы перейдете в Window, Organizer, Projects, Delete Derived Data, это не сработает. Вам нужно пройти через Настройки.
ericgu 01

@ericgu Да, но это не сработало. Я исправил свою проблему, но это было связано с тем, что я инициализировал словарь с жестко закодированными данными за один раз. Когда я переместил код для добавления жестко закодированных данных по одной строке за раз, проблемы с зависанием / замедлением сразу же исчезли.
Travis M.

Папка в ~ / Library / Developer / Xcode / DerivedData / на моем компьютере. Вы также можете найти его, перейдя в Window> Projects в Xcode.
Suragch

Спасибо. Это помогает. Проблема «вечной индексации» начинается сразу после того, как я обновил свою версию cocoaPod и выполнил установку модуля.
WKL

11

Вы используете CocoaPods? Сегодня я столкнулся с той же проблемой. (Используя xCode 6.1.1)

Чтобы решить эту проблему, я удалил все ~/Library/Developer/Xcode/DerivedData, в Podsпапке моего проекта и <project>.xcworkspace.

Затем я открыл терминал, перешел в каталог своего проекта и pod installснова запустил .


1
Да. На данный момент Xcode работает нормально. Но он все равно время от времени выдает ошибку сбоя sourcekit. Мое решение - удалить папку с производными данными.
Леонард

Рад видеть, что это сработало и для кого-то другого :). Похоже, что xCode пытается проиндексировать библиотеки CocoaPod и где-то застревает.
Michael Schinis

1
Удаление папки Pods и файла <project> .xcworkspace, а затем повторный запуск установки pod снова сработали.
KML

9

Была такая же проблема сегодня. Xcode 6.3.2, средний проект Swift. В какой-то момент он начал индексацию и никогда не закончил индексацию. Код, который вызвал это, был словарем типа [String: [String]], так что строковый ключ dict со строковыми массивами в качестве значений. У меня было два из них с ключами от A до Z, и каждая из этих 26 записей содержала массив строк от 5 до 10 строк.

Очистка производных данных не помогла. Только комментирование этих изречений заставило его снова пойти.

Честно говоря, это просто смешно! Apple необходимо исправить Xcode! При компиляции проектов Swift это уже ужасно медленно, но подобные ошибки - это серьезный недостаток. Я не могу с этим делать свою работу должным образом!


6

Для тех, у кого все еще есть эта проблема, я пришел к выводу, что это обходной путь, который избавляет вас от необходимости вводить объекты один за другим:

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

1
Вау ... У меня была точно такая же проблема. Спасибо! Я сообщил об этом в Apple как об ошибке. То, что ты сказал, для меня не сработало. Мне пришлось разбить свой длинный массив на меньшие массивы, каждый из которых содержит пять или меньше элементов.
ma11hew28

5

Что касается меня, я пробовал все вышеперечисленное безуспешно; но все, что мне нужно было сделать, это удалить папку с производными данными, затем открыть другой случайный проект, подождать, пока он проиндексируется, и теперь мой исходный (неисправный) проект работает!

Сделайте одолжение миру разработчиков, яблоко и сделайте свои быстрые компиляторы с открытым исходным кодом - чтобы не мешала нам ваша некомпетентность.


3

Я использую Xcode версии 7.3 (7D175)

Думаю, я мог понять основную проблему. Вот два случая, когда я застрял на этапе индексации:

  • Я создал замыкание, которое назначил переменной, и опустил сигнатуру типа. Я думаю, что у xcode были проблемы с этим шагом вывода типа. Если я правильно помню, одним из аргументов был CGPoint, у которого есть перегруженный конструктор. Моя гипотеза состоит в том, что существует слишком много возможностей того, что мое закрытие может принять в качестве аргументов.

  • Я переработал фабричный метод таким образом, что вместо возврата экземпляров одного типа он мог возвращать экземпляры многих типов с общим базовым классом. Похоже, что везде, где я использовал фабричный метод, мне приходилось приводить полученный объект к определенному типу (либо с помощью as?, Либо путем присвоения его переменной, которая принимает определенный тип). Опять же, шаг вывода типа, кажется, нарушен.

Похоже, то же самое происходит с объявлениями словарей, упомянутыми ранее. Я отправил отчет об ошибке с яблоком.


2

У меня возникла такая же проблема после обновления до 6.1. Xcode зависает при компиляции или индексировании без создания конкретного сообщения об ошибке.

Проблема была наконец решена путем разбиения некоторых более длинных выражений в файлах swift на несколько более коротких выражений. Часть моей программы объединяет множество различных строковых переменных, чтобы сформировать более длинную строку. Попытки объединить их в одно выражение и с помощью оператора присваивания сложения потерпели неудачу. Мне удалось заставить его работать, выполнив что-то похожее на следующее (упрощенное):

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

Я получил эту идею из-за того, что в предыдущей версии Xcode много раз получал следующую ошибку: «Выражение было слишком сложным, чтобы его можно было решить в разумные сроки; подумайте о том, чтобы разбить выражение на отдельные подвыражения».

Надеюсь это поможет


Да, спасибо, я действительно принял такие предложения. И я также сократил длину одного из моих файлов с 1500 строк примерно до 1200. И, конечно, я создал новый проект и импортировал в него все файлы один за другим. Затем, наконец, он снова включается. Не совсем уверен, кто из них лучший спаситель.
Леонард

Разделение длинного выражения на Swift помогло мне.
MandisaW

2

Я боролся с той же проблемой. Я пробовал два упомянутых решения (удаление производных данных и удаление .xcworkspace) безуспешно. Я также попытался медленно комментировать большую часть кода по крупицам и удалять файлы до тех пор, пока почти ничего не осталось, а индексация все еще зависала.

Я нашел решение, которое сработало для меня, я открыл проект со старой версией Xcode 6.1 (6A1030), у которой не было проблем с индексацией, затем вернулся к последней версии Xcode версии 6.1 (6A1052d), которую я использовал раньше, и индексация была исправил и продолжал хорошо работать.

Я пришел к выводу, что это ошибка Xcode версии 6.1 (6A1052d), которая, я надеюсь, улучшится в будущих выпусках.

Проблема действительно возникает время от времени, одно и то же исправление работает каждый раз. Я предполагаю, что другим решением было бы просто придерживаться более старой версии Xcode 6.1 (6A1030), но она не будет работать с устройствами под управлением iOS 8.1 и не будет иметь последних исправлений ошибок.


Я испробовал большинство предложений по решению проблемы с постоянным индексированием, и это было единственное, что у меня сработало. У меня не было более старого Xcode 6, но у меня был Xcode 5. Он не собирался, но он индексировал, и после этого Xcode 6.1 индексировался успешно.
SarahR

Я забыл упомянуть, что это было временное решение, и мне пришлось сделать это снова через несколько часов.
SarahR

2

Я пробовал это с Xcode 8.3.3. Вот мои результаты:

Вы можете написать отличный код Swift, который приведет к зависанию индексации.

Как только зависает индексация, зависает. Изменение кода Swift обратно на то, что не приводит к зависанию индексации, не помогает, он все равно зависает.

Закрытие проекта и повторное открытие в этой ситуации не помогает.

Выход из Xcode и его перезапуск помогает. Индексирование больше не будет зависать (то есть, если вы изменили код обратно на то, что не заставляет его зависать).

Также помогает перезагрузка Mac, хотя в этом нет необходимости.

Зависание вызвано прекрасным кодом Swift. Пример, на который я был похож

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

Индексирование зависало. Я закомментировал большую часть "??" строк, и все было хорошо (после выхода и перезапуска Xcode). Раскомментировал одну строку за другой. С некоторым количеством строк все было нормально, затем раскомментирование следующей строки заставило бы ее зависнуть.

Единственное, что помогает, видимо, - это изменение кода.


2

В моем Xcode решение заключалось в том, чтобы закрыть все избыточные окна. По какой-то причине многие открытые окна делают Xcode очень медленным.


для меня это тоже было решение, удивительное, поскольку оно давно работало хорошо с таким же количеством открытых окон
Кристиан,

1

В конце концов, я «решил» проблему, хотя это всего лишь временное решение.

Я создал еще один проект и по одному добавлял в него файлы. Затем я заметил «очень длинный» файл viewcontroller.swift. Затем я разбил его коды на модули и превратил эти многократно используемые коды в функции в другом быстром файле. Кроме того, я воспользовался предложением в Интернете, что длинные выражения следует разбивать на более короткие. Затем выполняется индексация и выполняется компиляция.

Так что на данный момент я "решил".

НО, я не думаю, что это правильно. Xcode IDE должна быть более чем способна обрабатывать мой «очень длинный» быстрый файл, всего 1500 строк. Я считаю, что это определенно ошибка (существующая уже давно), хотя Xcode 6.1 уже является обновлением Xcode 6.0.1.


1

Для меня я удалил приложение Xcode, снова загрузил его и установил. Это решило проблему, по крайней мере, сейчас.


1

Индексирование Xcode обычно для вашего кода для предложений и автозаполнения, среди прочего, например, помощь вам в раскадровках и наоборот. Но чтобы ускорить ваш проект xcode, вы можете выключить / включить его через терминал

Отключить
значения по умолчанию для индексации записать com.apple.dt.XCode IDEIndexDisable 1 Включить значения по умолчанию для индексации записать com.apple.dt.XCode IDEIndexDisable 0

Но лучше использовать быстрый Mac с хорошей оперативной памятью.


2
Отключение индексации серьезно повреждает Xcode, и этого не следует делать. Сказать кому-то о покупке нового Mac никогда не должно быть ответом, ноутбук двухлетней давности должен уметь обрабатывать последний Xcode.
Knight0fDragon

В macOS 10.13 Beta 7 появилась функция, которая приводит к сбою как Xcode 9 Beta 6, так и Xcode 8 при запуске индексатора. Отключение его было единственным способом продолжить использование Xcode, даже с урезанной версией.
Pegolon

1

Xcode 11.5 (11E608c) и все те же проблемы, через 6 лет после исходного вопроса. Я бы хотел «пометить» яблоко в этом вопросе, чтобы они могли увидеть этот беспорядок. Это большой проект (> 1000 файлов), и я был под часами, поэтому, когда я заметил индекс зависания, у меня было изменено более 100 файлов, и я не могу вернуться.

Все перепробовала:

  1. очистить производные данные и построить
  2. Перезагрузите xcode, перезапустите Mac
  3. удалить и добавить источник
  4. Искал словари, литералы и т. Д.

Проблема заключалась в создании массива:

private var overlayColors: [UIColor] = [UIColor(hex: "#b71c1c"), UIColor(hex: "#4a148c"),
                                        UIColor(hex: "#880e4f"), UIColor(hex: "#1de9b6"),
                                        UIColor(hex: "#f50057"), UIColor(hex: "#311b92"),
                                        UIColor(hex: "#f44336"), UIColor(hex: "#651fff"),
                                        UIColor(hex: "#d500f9"), UIColor(hex: "#3d5afe"),
                                        UIColor(hex: "#bf360c"), UIColor(hex: "#0d47a1"),
                                        UIColor(hex: "#006064"), UIColor(hex: "#2979ff"),
                                        UIColor(hex: "#ff6f00"), UIColor(hex: "#1a237e"),
                                        UIColor(hex: "#795548"), UIColor(hex: "#004d40"),
                                        UIColor(hex: "#00e676"), UIColor(hex: "#01579b"),
                                        UIColor(hex: "#33691e"), UIColor(hex: "#827717"),
                                        UIColor(hex: "#76ff03"), UIColor(hex: "#ffc400"),
                                        UIColor(hex: "#e65100"), UIColor(hex: "#00b0ff"),
                                        UIColor(hex: "#ff3d00"), UIColor(hex: "#616161"),
                                        UIColor(hex: "#263238"), UIColor(hex: "#ff1744")]

Что помогло мне обнаружить плохой файл Swift, так это то, что индексирование xcode заморозило, я сделал следующие шаги

  1. открыть монитор активности -> «быстрый» процесс -> показать информацию о процессе -> открыть файлы и порты. Это даст вам список файлов, которые выполняет этот процесс, детализируя список возможных плохих файлов.
  2. Другой удобный инструмент - этот скрипт, SOURCEKIT_LOGGING=3 /Applications/Xcode.app/Contents/MacOS/Xcode &> ~/Documents/xcode.logкоторый запустит Xcode с подробным уровнем 3 и начнет регистрацию в файле журнала.
  3. Найдите в файле журнала последние записи для ваших быстрых файлов, например: "my_project / Source / App /"

Это не полное решение, но полезно узнать, где искать.

открыть монитор активности -> «быстрый» процесс -> показать информацию о процессе -> открыть файлы и порты.


0

Если вы не против вернуться к 6.0.1, пока они не выяснят это, у меня это сработало. У меня была такая же проблема с 6.1 и 6.1.1. Теперь я в порядке. Попробую 6.2 когда выйдет.

Вы можете найти предыдущие версии программного обеспечения Apple на официальном сайте разработчиков здесь: https://developer.apple.com/downloads/index.action

Если вы это сделаете, не забудьте сначала удалить текущую копию Xcode.


0

Я использую Xcode 6.1.1 с быстрыми файлами на том же самом MacBook Pro.

Поскольку я продолжал добавлять строки в массив 3D-строк, Xcode внезапно стал непригодным для использования, и теперь я ничего не могу сделать.

Попробую вернуться на 6.1 и, надеюсь, проблема исчезнет.


У меня такая же проблема. После добавления массива словарей xcode пришел в негодность ... Решение нашли?
Almazini

Я вернулся к Xcode 6.1, который работал лучше. Он не застрял при индексации навсегда, но иногда я печатал и получал мяч на 4 секунды. В целом я смог написать достаточно кода, чтобы все было сделано. Я не менял свой код. Хотя на Xcode 6.1 аккумулятор MacBook Pro не выглядел слишком сильно затронутым, но на моем MacBook Air середины 2013 года, работающем с 6.1.1, время автономной работы абсолютно минимальное. После запуска Xcode остается от ~ 12 часов до 2 часов.
gardner888

0

Я вижу это в Xcode 6.3.2. Я очень надеялся, что через год после релиза у них будет работать компилятор, но, увы.

Если ни одно из вышеперечисленных решений не работает, попробуйте проверить свой код на наличие синтаксических ошибок. В процессе рефакторинга я извлек замыкание, но забыл указать параметры:

    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 }

Если я чему-то научился, работая в Swift, так это работать постепенно, чтобы не пришлось слишком много возвращаться, чтобы найти проблемный код.


0
  1. Ваш статус индексации - это «индикаторный кружок» или «индикатор выполнения»?
  2. Если это «индикаторный кружок», это означает, что он уже застрял в начале.
  3. Откройте и проверьте с другими вашими проектами, если они все одинаковы, это означает, что это системная проблема.
  4. Просто перезагрузите компьютер, и все будет хорошо.

0

Я использую Xcode 8.2 и тоже закончил с этой проблемой. Это началось после того, как я определил сложную переменную кортежа - массив кортежа с подмассивом кортежа. Все становится очень медленно, когда подмассив кортежа имеет свойство, которое вычисляется программно.

Как отмечалось в некоторых других ответах, индексация занимает вечность, и я считаю, что она пытается определить типы переменной.

Сначала я решил проблему, четко определив переменную с включенными типами. При обновлении свойства я сначала вычисляю его, а затем присваиваю кортежу, а не вычисляю при определении переменной.

Вот пример кода.

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

Суть в том, что не позволяйте Xcode выводить сложные структуры.


0

У меня была такая же проблема. Мой Xcode - 8.2.1. Но в моем случае я хотел создать массив словаря с 33 парами ключ-значение. Я делал так, что застрял при индексации:

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

Для меня сработало следующее:

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

У меня тоже была эта проблема, и я решил ее, удалив / изменив выражения с помощью оператора «+».

Я изменил это:

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

К этому:

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

Это решило проблему.

В конце 2013 года у моей машины максимальный объем MBP.


Собственно мой опыт. Он зависает с прекрасным кодом Swift, и единственный способ исправить это - изменить код.
gnasher729

0

Вы можете обновить до Xcode 6.1.1

Он был официально выпущен и для нас решена проблема индексации. В описании обновления говорится, что они применили исправления стабильности, поэтому очень вероятно, что оно будет работать более стабильно.


7
Интересный. Для меня, 6.1.1 представил бесконечные проблемы индексации, с проектом , который открывался штраф в 6.1. sign
Pascal Bourque

Понимаю. В нашем случае мы также упростили выражения и уменьшили размеры классов с помощью классов расширения. Что довольно смешно, что мы должны были это сделать, но это то, что мы должны были сделать. И, похоже, на данный момент это помогает. Также, комментируя строки, мы сузили, какая часть кода на самом деле «чрезмерно сложна» в соответствии с тем, что думает компилятор Swift, и уменьшили сложность насколько это возможно. Надеюсь, они скоро это исправят, потому что это довольно раздражает.
Ангел Найденов

0

Бета-версия Xcode 6.2 решила эту проблему для меня. Не молниеносно, но, по крайней мере, индексируется не вечно. Бета-версия не устанавливается поверх обычной установки Xcode, поэтому, если вам не нравится бета-версия, вы можете просто удалить ее.

Различные загрузки Xcode, включая бета-версию>


0

У меня были такие выражения:

let x = (value as? Int) ?? someDefault

также

guard let x = (dateFormatter().string(from: Date()) + msg + "\n").addingPercentEncoding(...) else { ... }

Итак, суть в том, чтобы переписать ваш файл, чтобы он содержал только выражения уровня детского сада, и проблема индексации исчезнет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.