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

Содержание

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

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

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

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

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

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

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


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

Все довольно просто. Мы делаем запрос к базе данных о наличие таких твитов, и, если такие твиты есть, то удаляем их. Но часть меншенов mentions, которые привязаны к этим твитам, также должна удалить эти твиты из множества tweets Взаимосвязи типа «To Many» и уменьшить свою популярность count на 1. Если для некоторых из этих mentions множество tweets будет пустым, то меншен также удаляется из базы данных. В такой ситуации мы не можем использовать правила удаления, заложенные в Core Data, мы должны написать свои собственные правила удаления, задействовав метод prepareForDeletion:

Метод prepareForDeletion вызывается до того, как твит удаляется. Для каждого удаляемого твита мы просматриваем множество mentionsSet связанных с ним меншенов и удаляем этот твит из множества tweets Взаимосвязи типа «To Many» с помощью функции removeFromTweetsсозданной для нас Xcode при выборе опции Category/Extension в Инспекторе для Сущности Mention.

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

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