XCode 8.0 Swift 3.0 медленная индексация и построение

Я установил XCode 8.0 и преобразовал Swift 2.2 в 3.0 (этот процесс также занимал много времени, я просто оставил свой Mac всю ночь). У меня нет большого проекта (около 20 файлов). Я также использую Pods. Индексирование предыдущей версии XCode (< 8.0) работало быстро, но теперь, после обновления, индикатор выполнения застревает в одной позиции (я уже жду час).

Вещи, которые я пробовал, которые мне не помогли:

  • Очистил папку DerivedData и перезапустил XCode
  • Убрал проект и перезапустил XCode
  • Удаленный каталог Pods с <project>.xcworkspace, а затем снова установлен
  • Перезагруженный Mac
  • Пробный проект сборки без Pods
  • Переустановлен XCode
  • Пробовал на другом Mac с клонированным проектом

Это действительно не здорово делать такие выпуски программного обеспечения, когда разработчикам приходится тратить часы на решение таких смешных проблем. Это очень разочаровывает. Любые идеи, как это исправить?

Ответ 1

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

У меня был такой код, и проект не индексировался:

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

Я изменил его на это и начал работать индексирование:

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

Ответ 2

Перейдите к настройкам проекта, затем выберите Редактоp > Добавить параметры сборки > Добавить пользовательские настройки и добавьте следующее:

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

Добавление этого флага удалило наше время компиляции чистой сборки с 7 минут до 65 секунд для быстрого проекта 40KLOC, чудом. Также можно подтвердить, что у двух друзей были аналогичные улучшения в корпоративных проектах.

Я могу только предположить, что это некоторая ошибка в Xcode 8.0

Ответ 3

У меня была такая же проблема только с момента обновления до Swift 3/XCode 8, и, похоже, это вызвано большими литералами массива.

Мне удалось исправить проблему, добавив аннотации типов к переменным, назначаемым литералу массива, например.

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

вместо

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

Ответ 4

У меня была аналогичная проблема, и после этого руководство было отлажено: http://irace.me/swift-profiling Моя проблема заключалась в том, что в некоторых строках я использовал оператор nil coalescing:

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

и четыре метода с этим вызывали дополнительное время постройки на 2 минуты.

Ответ 5

У меня была одна и та же проблема, и я решил ее, тщательно перебирая мой код по строкам, получается, что Swift 3 предпочитает строчную интерполяцию вместо использования символа +, т.е.

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

Если вы использовали вышеуказанный стиль кода, замените его на:

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

И ваше время сборки сразу же вернется к нормальной жизни.

Ответ 6

для тех, кто хочет найти, где компилятор "пойман"

Добавить в Other Swift Flags -Xfrontend -warn-long-function-bodies=50

проверить полный ответ здесь

Ответ 7

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

Выберите главную цель > Настройки сборки. Конфигурирование как изображение ниже.

введите описание изображения здесь

Ответ 8

Я столкнулся с той же проблемой индексирования, но это произошло только тогда, когда я запускал/отлаживал на устройстве, а затем переключился на другое устройство на верхней левой панели инструментов (Target > iPhone).

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

Мое решение: Я удалил свою локальную рабочую копию git и клонировал новую из моего "источника".

(Есть некоторые "волшебные" файлы в папках xcuserdata/shared/session и т.д., которые могли вызвать эту проблему?)

Ответ 9

Моя проблема была в словаре. У меня был большой словарь.

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]

Я разбил его на:

        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

Ответ 10

После добавления настройки

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

время сборки проекта с чистого листа составляет от 1200 до 180 секунд для 650 быстрых файлов. Но это приведет к сбою компиляции. Для каждого изменения требуется 180s для компиляции, когда компиляция увеличивается только 60 секунд

Ответ 11

Это ошибка Xcode (Xcode 8.2.1), и это произойдет, когда у вас большой литерал словаря или вложенный словарь. Вам нужно разбить словарь на более мелкие части и добавить их с помощью метода добавления, пока Apple не исправит ошибку.

Ответ 12

Это работает для меня в Xcode 8.2.1 и Swift 3, когда "индексирование" застряло:

У меня всегда есть два открытых проекта, фиктивный проект и проект, над которым я работаю. У меня также есть устройство iPad Air, связанное с тем, что я запускаю свои проекты. Когда мой проект застревает в "Индексировании", я переключаюсь на мой проект-макет и запускаю свой проект на подключенном устройстве iPad Air. Затем я останавливаю проект и вернитесь к проекту, над которым я работаю, и "Индексирование" магически закончено. Это также должно работать только с симулятором, если у вас нет подключенного физического устройства.

Ответ 13

Не то, чтобы я думал, что это связано с проблемой OP, но XCode 8 для меня недавно замедлился. В конце концов я обнаружил, что это была моя ошибка (и я помню, как это невольно) - я добавил XCode.app в качестве ссылки на Framework. Это существенно упростило поиск XCode и индексацию всей папки XCode.app. Как только я увидел ошибку и удалил Framework, он снова стал хорошим:)

Ответ 14

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

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
}

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

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
}

После этого, когда я проверял ~ 10 раз, время компиляции сокращалось с минуты до нескольких миллисекунд.

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

Ответ 15

Что решает это для меня, это использовать ключи для установки значений словаря

let dict: [string:any]()
dict["key"] = "value"
dict["key1"] = "value"
dict["key2"] = "value"
return dict

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