Подтвердить что ты не робот

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 с клонированным проектом

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

4b9b3361

Ответ 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 ключей, должно быть установлено.