Задание 5 cs193p Spring 2016 Smashtag Mentions Popularity. Решение дополнительного пункта 4 (удаление старой информации из Core Data).

Screen Shot 2016-08-14 at 12.47.59 PM

Содержание

Текст Домашнего Задания 5 на английском языке доступен на  iTunes в пункте “Programming: Project 5: Smashtag Mentions Popularity″На русском языке вы можете скачать здесь:

Задание 5 iOS 9.pdf

Начало решения Задания 5 — все обязательные и дополнительные пункты, кроме 4-го дополнительного пункта — находятся в посте «Задание 5 cs193p Spring 2016 Smashtag Mentions Popularity (Клиент Twitter). Решение».

В данном посте мы рассмотрим особенности решения дополнительного пункта 4 Задания 5, считая, что все предыдущие обязательные и дополнительные пункты Задания 5 выполнены. В решении, представленном ниже, используется  UIManagedDocument для получения контекста базы данных Core Data.

Код для Задания 5 без дополнительного пункта 4 находится на Github для Xcode 7 и Swift 2.2
Код для полного Задания 5 (включая дополнительный пункт 4) находится на Github для Xcode 7 и Swift 2.2.

Если вы установили Xcode 8, то для Swift 2.3 код находится на Github, а для Swift 3 — также на Github.

Следуем методики разработки Core Data приложений, изложенному Полом Хэгерти на Лекции 11.

Пункт 4 дополнительный

Вам не требуется нигде что-либо уничтожать из базы данных, тем не менее, нам необходима информация лишь о наиболее поздних поисках в Twitter, так что со временем у нас напрасно занимается большой объем дискового пространства. Заставьте ваше приложение удалять из базы данных объекты, которые больше не представляют интереса (то есть доступ к этим данным не будет осуществляться в вашем UI) с тем, чтобы поддерживать регулируемый размер базы данных. Вы должны самостоятельно решить, когда наступает подходящее время для удаления уже неиспользуемых данных. 


Для поддержания регулируемого размера базы данных будем удалять твиты старше недельной давности. Для этого создадим в классе TweetM метод removeOldTweets:

Screen Shot 2016-08-14 at 12.09.10 PM

Все довольно просто. Мы делаем запрос к базе данных о наличие таких твитов, и, если такие твиты есть, то удаляем их.
Но часть меншенов, которые привязаны к этим твитам, должна изменить свою популярность count. Поэтому нам нужна подготовка к удалению твита TweetM,  которая состоит в том, что мы будем уменьшать популярность count связанных с этим твитом меншенов на 1 и, если популярность count упадет до 0, то мешен удаляется из базы данных.

Screen Shot 2016-08-14 at 12.24.35 PM

В свою очередь, если удаляется меншен mension, экземпляр класса Mension, то также требуется подготовка к удалению, которая состоит в том, что если поисковый термин term, которым маркирован данный меншен, не имеет «живых» меншенов, то он тоже удаляется:

Screen Shot 2016-08-14 at 12.31.59 PM

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

Screen Shot 2016-08-11 at 2.50.12 PM

Видите? Мешены не привязаны к твитам, нам это было не нужно. Мы использовали твит для добавления популярности меншену, то есть выполнили операцию

mentionM.count = mentionM.count!.integerValue + 1

и забыли об этом твите.

Но ситуация меняется, если перед нами поставлена задача удалять старые твиты. Теперь мы должны корректировать популярность меншенов count, уменьшая ее на столько, сколько твитов, связанных с этим мешенном, удаляется. Следовательно, нам нужна Взаимосвязь между Сущностями TweetM и Mension. Эта Взаимосвязь будет иметь тип «To Many» с обоих концов.

Screen Shot 2016-08-14 at 12.47.59 PM

Естественно мы должны скорректировать методы заполнения базы данных с тем, чтобы наполнять эту Взаимосвязь данными:

Screen Shot 2016-08-14 at 12.54.17 PM

Теперь алгоритм, изложенный в начале этого поста будет работать и мы сможем использовать метод removeOldTweets при запуске приложения в AppDelegate:, причем в контексте, который работает не на main queue, то есть не будет блокировать наш UI :

Screen Shot 2016-08-14 at 1.45.12 PM

Код находится на Github.