Форум программистов, компьютерный форум CyberForum.ru

Swift

Войти
Регистрация
Восстановить пароль
 
RafDev
0 / 0 / 0
Регистрация: 04.01.2016
Сообщений: 27
#1

Долго компилится - Swift

18.01.2016, 14:14. Просмотров 321. Ответов 7
Метки нет (Все метки)

Здравствуйте!
В ios swift я начинающий программист.
Пишу что-то вроде словаря.
Для работы с ним использую Core Data.
Цель - инициализация базы (заполнить базу словами после установки приложения)

Столкнулся с проблемой: мой проект долго (больше минуты) компилится.
Появилось это после того, как мне пришла "гениальная мысль" засунуть в код словарь на 300 слов,
который я и использую один раз после установки, чтоб из него загрузить данные в базу.
Выглядит он так:
Objective-C
1
2
3
4
5
let dic = [
("слово1", "описание", "доп описание"),
("слово2", "описание", "доп описание"),
("слово3", "описание", "доп описание")
]
Слов будет несколько тысяч, и компилиться это будет бесконечно.

Подскажите пожалуйста:
- есть ли более удобный способ инициализации базы данных?
- чем занимается компилятор все это время? (хочется понять суть проблемы)

Заранее благодарю за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2016, 14:14     Долго компилится
Посмотрите здесь:

Не компилится! C++
Windows XP Долго прогружается, там где бегунок тусклый экран долго, а потом загрузка
C++ не компилится с++
Windows 7 Ноутбук долго выключается и долго входит в спящий режим
Долго загружается нетбук. Долго открываются все окна (проводник, плееры, браузеры, прочее)
Объемная папка плохо реагирует на операции перемещение и удаление (долго подготавливается, думает долго)
C# WPF Behavior не компилится, не хватает конструктора. Объявляю, не компилится. Не пойму
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
19.01.2016, 03:55     Долго компилится #2
во-первых, это не словарь, а массив кортежей
во-вторых, не совсем ясно или скорость компиляции зависит именно от этого массива
возможно вывод типов сильно озадачен тем, чтобы самому разобраться как правильно подставить типы всей этой махине, но это странно, потому что массив дженерик тип и достаточно узнать тип первого кортежа, чтобы определить тип всему массивы
в-третьих, более подходящим решением было бы хранить это все в plist файле, либо в csv или еще каком-то подходящем формате, а на старте выгружать все в базу если она пустая
RafDev
0 / 0 / 0
Регистрация: 04.01.2016
Сообщений: 27
19.01.2016, 18:03  [ТС]     Долго компилится #3
Сделал как вы посоветовали - все летает!
Все данные поместил в plist, загружаю их в базу при первом запуске.
Спасибо!

Думаю проблема была именно в этом массиве,
т.к. оставив в нем из 300 только 30 элементов, все заработало как обычно.

Еще вопрос:
На сколько сложно вытащить данные из plist из опубликованного приложения?
В каком виде он хранится? И что вообще там с ним происходит?
cin_cout
26 / 26 / 7
Регистрация: 06.10.2012
Сообщений: 119
20.01.2016, 16:24     Долго компилится #4
Цитата Сообщение от RafDev Посмотреть сообщение
На сколько сложно вытащить данные из plist из опубликованного приложения?
В каком виде он хранится? И что вообще там с ним происходит?
А зачем вам CoreData, если вы используете .plist ? Это разный подход к data persistence. В первом случае - чудовищно мощный функционал СУБД, во втором - ресурсосберегающее файловое хранение в XML-файле, всё компактно и шустро.

Работать с .plist можно напрямую из VC, без CoreData. Например пишем во ViewController:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func documentsDirectory() -> String {
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        return paths[0]
    }
    
    func dataFilePath() -> String {
        return(documentsDirectory() as NSString).stringByAppendingPathComponent("ИмяФайлаНаВашВкус.plist")
    }
 
func saveЧтоНибудьНужное () {
        let data = NSMutableData()
        let archiver = NSKeyedArchiver(forWritingWithMutableData: data) // NSKeyedArchiver - разновидность NSCoder, инструмент для записи/чтения из файла
        archiver.encodeObject(lists, forKey: "ИмяКлюча")
        archiver.finishEncoding()
        data.writeToFile(dataFilePath(), atomically: true)
    }
    
    func loadЧтоНибудьНужное() {
        let path = dataFilePath()
        if NSFileManager.defaultManager().fileExistsAtPath(path) {
            if let data = NSData(contentsOfFile: path) {
                let unarchiver = NSKeyedUnarchiver(forReadingWithData: data)
                lists = unarchiver.decodeObjectForKey("ИмяКлюча") as! [ТипОбъекта]
                unarchiver.finishDecoding()
            }
        }
    }
Нужно реализовать в классе "ТипОбъекта" (обычный .swift файл, в котором вы Data Model прописываете) методы протокола NSCoding -
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
    required init?(coder aDecoder: NSCoder){
        aDecoder.decodeObjectForKey("ПеременнаяКласса1") as! ТипПеременной1
        aDecoder.decodeObjectForKey("ПеременнаяКласса2") as! ТипПеременной2 
        и тд для каждой переменной класса
        super.init()
    }
    
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(name, forKey: "ПеременнаяКласса1")
        aCoder.encodeObject(items, forKey: "ПеременнаяКласса2")
        и тд 
    }
Добавьте в первый ViewController такой инициализатор:
Objective-C
1
2
3
4
5
required init? (coder aDecoder: NSCoder) {
            тут какие-то полезные манипуляции с данными 
        super.init(coder: aDecoder)
        loadЧтоНибудьНужное() 
    }
И всё, данные сохраняются локально в .plist файл, только в дебаггере надо отследить path, куда его Xcode плюхнет. Надеюсь, поможет улучшить быстродействие.
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
20.01.2016, 20:25     Долго компилится #5
Цитата Сообщение от cin_cout Посмотреть сообщение
А зачем вам CoreData, если вы используете .plist ?
по своему опыту могу сказать, что это хороший способ предзаполнить БД, а дальше уже выполнять различные операции (запись, чтение, сложные выборки и тд), с plist так не поиграешься, да и в памяти все это делать, может быть ресурсоемко

Цитата Сообщение от RafDev Посмотреть сообщение
На сколько сложно вытащить данные из plist из опубликованного приложения?
В каком виде он хранится? И что вообще там с ним происходит?
вы можете сами посмотреть бандл аппа (archive -> export) и что в каком виде там лежит
для симулятора можно еще глянуть, что хранится в файловой системе вашего аппа при помощи SimPholders

обычно он шифруется и не подойдет для "тупого" копирования, если какой-то умник вскроет ваш бандл, но снова-таки, сархивируйте апп для девайса, экспортните бандл и посмотрите или вам подходит
cin_cout
26 / 26 / 7
Регистрация: 06.10.2012
Сообщений: 119
20.01.2016, 21:38     Долго компилится #6
Цитата Сообщение от Vorona Посмотреть сообщение
по своему опыту могу сказать, что это хороший способ предзаполнить БД, а дальше уже выполнять различные операции (запись, чтение, сложные выборки и тд), с plist так не поиграешься, да и в памяти все это делать, может быть ресурсоемко
Да, спасибо за дополнение, конечно, я не имел в виду случаи, когда функционал БД реально требуется, просто про хранилище написал.
С точки зрения предзаполнения БД - интересная мысль, а в каких случаях практикуете? Чем обусловлено такое решение?
RafDev
0 / 0 / 0
Регистрация: 04.01.2016
Сообщений: 27
21.01.2016, 12:21  [ТС]     Долго компилится #7
Цитата Сообщение от Vorona Посмотреть сообщение
не подойдет для "тупого" копирования
Этого мне вполне достаточно. Спасибо.
Воспользуюсь этой темой, чтоб задать еще один вопрос:

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

Как сделать подобное?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2016, 19:30     Долго компилится
Еще ссылки по теме:

Windows 7 Долго запускается и долго завершение виндоус 7 происходит
Не компилится( Prolog
Есть вирус. Долго выключается комп, и долго думает
Oracle Почему не компилится
Java Не компилится проект

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
21.01.2016, 19:30     Долго компилится #8
Цитата Сообщение от RafDev Посмотреть сообщение
Воспользуюсь этой темой, чтоб задать еще один вопрос:
лучше создать отдельную тему, чтобы другие смогли найти ответ

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

Цитата Сообщение от cin_cout Посмотреть сообщение
а в каких случаях практикуете? Чем обусловлено такое решение?
бывает, когда есть какая-то начальная база и ее не хочется тянуть с сервера

список каких-то препаратов на продажу или еще что-то, откуда можно танцевать.
например апп имеет какие-то категории\жанры\имена по-умолчанию и поверх них может добавлять свои, так вот первые можно подгружать из заготовок.
для демо или туториалов можно юзать, чтобы вместо скриншотов провести пользователя по "реальному" флоу и показать как себя будет вести апп, когда там будет куча всего.

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

Еще, помню, как-то делали еще круче. Создавали БД, заполняли ее из plist, потом эти sqlite файлы клали в бандл и при старте, копировали их в то место, где они должны лежать и приложение моментально поднималось с нужными данными.
Такое делали на фонгепе, когда работа с базой в одном потоке может быть напряжная, и парсить plist, а потом все это записывать в базу могло занимать намного больше времени, чем просто сказать плагину переложить файлик с готовой БД в нужное место.
Yandex
Объявления
21.01.2016, 19:30     Долго компилится
Ответ Создать тему
Опции темы

Текущее время: 21:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru