Xcode 8.0 Swift 3.0 медленное индексирование и построение



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


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




  • очистить DerivedData папку и перезапустить Xcode

  • очистить проект и перезапустить Xcode версии

  • удалены с <project>.xcworkspace и затем снова установлен

  • Перезапущен Mac

  • пробовал строить проект без стручков

  • Переустановить Xcode

  • пробовал на другом Mac с клонированным проектом


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

770   16  

16 ответов:

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

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

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

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

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

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

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

у меня была такая же проблема только с момента обновления до 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"]

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

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

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

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

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

Если вы использовали выше стиль кода заменить его на;

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

и Ваше время сборки немедленно вернется к норме.

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

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

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

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

выберите главная цель > параметры сборки. Настройка как изображение ниже.

enter image description here

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

ни одно из решений выше не работало для меня.

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

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

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

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

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 раз я проверял, время компиляции сократилось с минуты до нескольких миллисекунд.

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

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

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

после добавления параметра

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

наш проект clean-build время компиляции от 1200s до 180s для 650 swift файлов. Но это приведет к увеличению компиляции сбой. Каждое изменение нужно 180s для компиляции, когда увеличение компиляции нужно только 60s

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

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

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

резервное копирование вашего проекта удалите последний проект обновления после резервного копирования, а затем перезапустите Xcode simple : -)

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

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

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

Comments

    Ничего не найдено.