Задание 5 CS193P 2016

31 views
Skip to first unread message

Ilya Dolgopolov

unread,
Jul 5, 2016, 12:06:21 PM7/5/16
to Swift [ru]
тема для обсуждения 5-го задания, мне кажется оно сложным в плане понимая, что требуется

Как-то задания в отличии от лекции сложно понимать (

единственное думаю, сортировку по кол-ву (о которой Пол говорил еще в 11 лекции) пробовать делать через fetched properties
если кто в теме, я правильно думаю?

tatiana.kornilova

unread,
Jul 6, 2016, 12:34:57 AM7/6/16
to Swift [ru]
Попробуйте с  fetched properties, но это вряд ли - Пол Хэгерти их никогда не показывал и не приветствовал. 
Мне кажется лучше рассмотреть возможность создания еще одной сущности Mensions или двух Search и Mensions. Сущность Mensions связана с сущностью  Tweet. В сущности Mensions предусмотреть поле countTweets и заполнять его при записи данных в Core Data.
Это просто наброски - пока занимаюсь другим.

вторник, 5 июля 2016 г., 19:06:21 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
Jul 6, 2016, 12:46:41 PM7/6/16
to Swift [ru]
А вот вопрос по формулировкам: в описании 4-го задания половина пунктов дублировало то, что Пол делал на лекции.

Может и в 5-т тож самое? какой смысл создавать новую схему? если можно доделать текущую?

тем более в 11-ой он говорит, что нам нужно улучшить то, что он показывает

Ilya Dolgopolov

unread,
Jul 7, 2016, 1:44:19 PM7/7/16
to Swift [ru]
Я для теста, улучшил пример 11-й лекции:

для TwitterUser добавил поле count, а так же метод, что вызывается из updateUI

    class func tweetCountWithMentionByTweeterUser(inManagedObjectContext context: NSManagedObjectContext, withPredicate predicate: String) {

        let requestUsers = NSFetchRequest(entityName: "TweeterUser")

        requestUsers.predicate = NSPredicate(format: "any tweets.text contains[c] %@", predicate)

        if let users = (try? context.executeFetchRequest(requestUsers)) as? [TweeterUser] {

            for u in users {

                var count = 0

                let request = NSFetchRequest(entityName: "Tweet")

                request.predicate = NSPredicate(format: "text contains[c] %@ and tweeter = %@", predicate, u)

                context.performBlockAndWait {

                    count = context.countForFetchRequest(request, error: nil)

                }

                u.count = count

            }

        }

        do {

            try context.save()

        } catch let error {

            print("Core Data Error: \(error)")

        }

    }

по мне так решение так себе ((( слишком чопорное по я 3 дня уже голову ломаю, вообще ничего не рождается
сортировку сделал:

request.sortDescriptors = [NSSortDescriptor(

                key: "count",

                ascending: false,

                selector: #selector(NSString.localizedCaseInsensitiveCompare(_:))

                ), NSSortDescriptor(

                key: "screenName",

                ascending: true,

                selector: #selector(NSString.localizedCaseInsensitiveCompare(_:))

                )]

В интернете ниодного примера, либо еще никто не дошел, либо все подписали договор о неразглашении


мой код как всегда тут: https://github.com/llodi/Smashtag_cs193p_Spring

Ilya Dolgopolov

unread,
Jul 7, 2016, 2:26:20 PM7/7/16
to Swift [ru]
И если кому интересно то тут http://stackoverflow.com/questions/20531319/coredata-..
описано почему @count не годится, тк count можно отсортировать только после извлечения данных, но не в процессе как с атрибутами
а тк мы извлечение данных делаем через NSFetchedResultsController сортировки не получится

я так это понимаю, может я не прав, поправьте

вторник, 5 июля 2016 г., 19:06:21 UTC+3 пользователь Ilya Dolgopolov написал:
тема для обсуждения 5-го задания, мне кажется оно сложным в плане понимая, что требуется

tatiana.kornilova

unread,
Jul 8, 2016, 2:16:27 AM7/8/16
to Swift [ru]
Да, вы правильно понимаете. Все дело в дескрипторах сортировки. Как вы видите, там нужно явно указать название ключа сортировки

NSSortDescriptor(

                key: "count",

                ascending: false,

                selector: #selector(NSString.localizedCaseInsensitiveCompare(_:))

                )

Из этого и исходите - значит к вас должно быть поле с именем "count". 
Теперь читаем внимательно Задание 5 Обязательный пункт № 1

В вашей закладке Recent Searches, добавьте Detail Disclosure кнопку для каждой строки.
Если вы ее выбираете, то вы должны "переехать" на новый табличный MVC, списком в котором являются все mentions с user и hashtag
 (uniqued, case-insensitively) во всех tweets, когда либо выбираемых для поискового терма (текста), находящегося в этой строке. 
Упоминания  mentions являются уникальными и нечувствительными к регистру.
Сразу можно составить таблицу для сущности SearchTerm:

searchText - String
keyword     - String
type            - String
count          - Integer 
Это соответствует тому, что нужно поместить в Tab View.
Пока это не нормализованная схема базы данных. 
Для нормализованной нужно сделать две таблицы.
Но начните с этой простой не нормализованной.
Далее смотрите в коде в то место, где Пол пишет в базу данных каждый отдельный твит.
Добавляете туда ваш код заполнения вышепредставленной таблицы, в том числе и увеличивайте на 1 поле count для соответствующих атрибутов.
И все.
Пока можно не связывать эту таблицу ни с чем. Просто тупо пишите в нее информацию и отобразите ее правильно в новом MVC.

четверг, 7 июля 2016 г., 21:26:20 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
Jul 8, 2016, 2:54:58 AM7/8/16
to Swift [ru]
Спасибо за наводку

Я вот разработал следующую схему:



Единственное сомневаюсь: ToMany - ToMany, в другой стороны в одном твите могут быть 2 одинаковых хештега, к примеру.

но у же сейчас у меня ошибка возникает: Cannot assign value of type 'Hashtags?' to type 'NSSet'

Auto Generated Inline Image 1

tatiana.kornilova

unread,
Jul 8, 2016, 3:29:59 AM7/8/16
to Swift [ru]
Очень непонятная и плохая схема: что такое unique? Вы что по твитам суммируете mentions? По схеме тоже вроде так не выходит. Если так, то это не рационально - в вашей задаче вам твиты уже не нужны, избавьтесь от них на этапе записи. Нужно поставить во главу угла searchTerm.
Кроме того, зачем вам разные таблицы, если вы будете помещать их в одну таблицу? Добавьте атрибут type - это либо hashtag,  либо user.

Видите? У меня связь один - ко многим. Потому что я убрала твиты.
Связь many -to- many очень тяжело вам будет отображать в таблице. Зачем изначально усложнять себе задачу?

пятница, 8 июля 2016 г., 9:54:58 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
Jul 8, 2016, 3:48:41 AM7/8/16
to Swift [ru]
ну к unique эт замечания к Полу, он его использовал, я взял пример.
Для меня эта задача ровно такая же как и с Users, показанная Полом в примере, где он использовал Tweets. Чем она отличается:)? 
count в данном случае - это кол-во упоминаний данного mention в твите.

Разные таблицы, т.к. далее в доп задании нужно будет по секциям разбивать.


пятница, 8 июля 2016 г., 10:29:59 UTC+3 пользователь tatiana.kornilova написал:

Ilya Dolgopolov

unread,
Jul 8, 2016, 3:53:15 AM7/8/16
to Swift [ru]
хотя разбивка на 2 таблицы, да, излишняя, переделаю


пятница, 8 июля 2016 г., 10:29:59 UTC+3 пользователь tatiana.kornilova написал:
Очень непонятная и плохая схема: что такое unique? Вы что по твитам суммируете mentions? По схеме тоже вроде так не выходит. Если так, то это не рационально - в вашей задаче вам твиты уже не нужны, избавьтесь от них на этапе записи. Нужно поставить во главу угла searchTerm.

tatiana.kornilova

unread,
Jul 8, 2016, 3:56:46 AM7/8/16
to Swift [ru]
Вы пытаетесь переделать схему Пола? Это из другой оперы. У вас совсем другое задание - читайте внимательно Задание 5. 
Впрочем я не хочу нарушать процесс самообразования.

пятница, 8 июля 2016 г., 10:48:41 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
Jul 8, 2016, 4:23:02 PM7/8/16
to Swift [ru]
Сделал так, как хотел, по аналогии с примером


без условия что единичные упоминания не показывать (добавлю потом просто and count > 1)

протестил на своих твитах 

вторник, 5 июля 2016 г., 19:06:21 UTC+3 пользователь Ilya Dolgopolov написал:

Ilya Dolgopolov

unread,
Jul 9, 2016, 2:27:31 AM7/9/16
to Swift [ru]
я сделал 5-е задание https://github.com/llodi/Smashtag_cs193p_Spring
с секциями и количеством не менее 1
буду двигать дальше


вторник, 5 июля 2016 г., 19:06:21 UTC+3 пользователь Ilya Dolgopolov написал:
тема для обсуждения 5-го задания, мне кажется оно сложным в плане понимая, что требуется

Ivan Lazarev

unread,
Sep 9, 2016, 3:52:10 AM9/9/16
to Swift [ru]
Мое решение обязательных пунктов задания 5 https://github.com/ballard/Twitter-client-sc193p/tree/assignment_5


вторник, 5 июля 2016 г., 19:06:21 UTC+3 пользователь Ilya Dolgopolov написал:
тема для обсуждения 5-го задания, мне кажется оно сложным в плане понимая, что требуется

Ivan Lazarev

unread,
Sep 10, 2016, 9:20:14 AM9/10/16
to Swift [ru]
решение дополнительных пунктов задания 5: https://github.com/ballard/Twitter-client-sc193p/tree/assignment_5

пятница, 9 сентября 2016 г., 10:52:10 UTC+3 пользователь Ivan Lazarev написал:
Reply all
Reply to author
Forward
0 new messages