Содержание
Текст Домашнего Задания 5 на английском языке доступен на iTunes в пункте “Programming: Project 5: Smashtag Mentions Popularity″. На русском языке вы можете скачать здесь:
Начало решения Задания 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:
Все довольно просто. Мы делаем запрос к базе данных о наличие таких твитов, и, если такие твиты есть, то удаляем их.
Но часть меншенов, которые привязаны к этим твитам, должна изменить свою популярность count. Поэтому нам нужна подготовка к удалению твита TweetM, которая состоит в том, что мы будем уменьшать популярность count связанных с этим твитом меншенов на 1 и, если популярность count упадет до 0, то мешен удаляется из базы данных.
В свою очередь, если удаляется меншен mension, экземпляр класса Mension, то также требуется подготовка к удалению, которая состоит в том, что если поисковый термин term, которым маркирован данный меншен, не имеет «живых» меншенов, то он тоже удаляется:
получилась своеобразное условное каскадное удаление. Но есть одно НО.
Давайте посмотрим на схему базы данных, которую мы сформировали для предыдущих обязательных и дополнительных пунктов данного Задания.
Видите? Мешены не привязаны к твитам, нам это было не нужно. Мы использовали твит для добавления популярности меншену, то есть выполнили операцию
mentionM.count = mentionM.count!.integerValue + 1
и забыли об этом твите.
Но ситуация меняется, если перед нами поставлена задача удалять старые твиты. Теперь мы должны корректировать популярность меншенов count, уменьшая ее на столько, сколько твитов, связанных с этим мешенном, удаляется. Следовательно, нам нужна Взаимосвязь между Сущностями TweetM и Mension. Эта Взаимосвязь будет иметь тип «To Many» с обоих концов.
Естественно мы должны скорректировать методы заполнения базы данных с тем, чтобы наполнять эту Взаимосвязь данными:
Теперь алгоритм, изложенный в начале этого поста будет работать и мы сможем использовать метод removeOldTweets при запуске приложения в AppDelegate:, причем в контексте, который работает не на main queue, то есть не будет блокировать наш UI :
Код находится на Github.