ios - Indexação e construção lenta do Xcode 8.0 Swift 3.0




indexing swift3 (11)

É um bug do Xcode (Xcode 8.2.1) e acontecerá quando você tiver um literal de dicionário grande ou um literal de dicionário aninhado. Você precisa quebrar o dicionário em partes menores e adicioná-las com o método append até a Apple corrigir o erro.

Instalei o Xcode 8.0 e converti o Swift 2.2 para 3.0 (esse processo também demorou muito tempo, deixei meu Mac funcionando a noite toda). Não tenho um grande projeto (cerca de 20 arquivos). Eu também estou usando Pods . A indexação da versão anterior do Xcode (<8.0) funcionou rapidamente, mas agora, após a atualização, a barra de progresso fica presa em uma posição (já estou aguardando uma hora).

Coisas que tentei que não me ajudaram:

  • DerivedData pasta DerivedData e reiniciou o Xcode
  • Limpou o projeto e reiniciou o Xcode
  • Diretório de Pods excluídos com <project>.xcworkspace e, em seguida, instalado novamente
  • Mac reiniciado
  • Tentei criar projeto sem Pods
  • Xcode reinstalado
  • Tentei em outro Mac com projeto clonado

Não é realmente legal fazer tais lançamentos de software quando os desenvolvedores precisam gastar horas resolvendo problemas tão ridículos. Isso é muito decepcionante. Alguma idéia de como corrigir isso?


Depois de adicionar a configuração,

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

nosso projeto compila tempos de compilação de 1200 a 180s para 650 arquivos rápidos. Mas isso causará um aumento na falha de compilação. Toda mudança precisa de 180s para compilar quando o aumento da compilação precisa apenas de 60s


Eu tentei as soluções acima, mas o problema ainda acontece. A depuração também funciona estranha. Após alguns dias de pesquisa, encontrei a solução abaixo.

Selecione o destino principal> Configurações de compilação. Configurando como imagem abaixo.


Eu tinha uma função que demorou um minuto para compilar e, após alguma investigação, descobri que o culpado estava verificando se havia passado tempo suficiente a partir de uma data armazenada:

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
}

Esse código levaria mais de 10 segundos para ser compilado - juntamente com esse código sendo repetido com números diferentes várias vezes, estava fazendo com que a compilação demorasse muito tempo. Consegui consertar isso pré-computando o intervalo

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
}

Depois de fazer isso com as ~ 10 vezes que eu estava verificando, o tempo de compilação foi reduzido de mais de um minuto para apenas alguns milissegundos.

É extremamente provável que esse problema também ocorra com a combinação de dedução de tipo e matemática em outro lugar, para garantir que nada disso aconteça em qualquer outro lugar do seu código.


Eu tive o mesmo problema e resolvi-o examinando minuciosamente meu código linha por linha. Acontece que o Swift 3 prefere a interpolação de strings em vez de usar o símbolo +, ou seja,

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

Se você estiver usando o estilo de código acima, substitua-o por;

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

E seu tempo de compilação voltará imediatamente ao normal.


Eu tive um problema semelhante e segui este guia para depurar: http://irace.me/swift-profiling Meu problema era que eu tinha um operador coalescente nulo em algumas seqüências de caracteres, por exemplo:

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

e quatro métodos com isso estavam causando 2 min de tempo de construção adicional.


Isso funciona para mim no Xcode 8.2.1 e no Swift 3 quando a "Indexação" está bloqueada:

Eu sempre tenho dois projetos abertos, um projeto fictício e o projeto em que estou trabalhando. Também tenho um dispositivo iPad Air conectado no qual executo meus projetos. Quando meu projeto fica preso em "Indexação", alterno para o meu projeto fictício e o executo no meu dispositivo iPad Air conectado. Então paro o projeto e volto ao projeto em que estou trabalhando, e a "Indexação" é finalizada magicamente. Isso também deve funcionar apenas com o simulador, se você não tiver um dispositivo físico conectado.


Meu problema foi o dicionário. Eu tinha variado dicionário grande.

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]

Eu a dividi em:

        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

O que resolve isso para mim é usar chaves para definir valores de dicionário

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

Se você tiver um dicionário longo, ele pode ou não causar um loop de compilação, resultando em longos tempos de compilação. Qualquer coisa com mais de 8 teclas deve ser ajustada.


Resolvi o problema comentando todos os arquivos e removendo os comentários um a um. Eu descobri que o problema ainda está na declaração da matriz, conforme descrito here .

Eu tinha um código como este e o projeto não estava indexando:

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

Eu mudei para isso e a indexação começou a funcionar:

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

para quem quer descobrir onde o compilador é "capturado"

Adicionar a Other Swift Flags -Xfrontend -warn-long-function-bodies=50

veja a resposta completa here





xcode8