Tak, mam za zadanie wdrożenie „retweet' podobną funkcjonalność w aplikacji (iOS Swift), stosując Parse.parse.com „Prześlij dalej” wzór jest zbyt rozwlekły
Zostało to zadane przed here, ale to jest dość wysoki poziom i b) Dostaję to zadanie pod ręką - niekoniecznie proszę o pomoc w decyzjach architektonicznych, ale jeśli wydaje mi się, że oczywiście brakuje mi coś, jestem szczęśliwy, aby przyjąć opinie.
Moja aplikacja ma PRZYCZYNY, które są tworzone przez UŻYTKOWNIKA. Istnieje również tabela FOLLOW z użytkownikiem TO i użytkownikiem FROM. Na początek po prostu odpytuję tabelę przyczyn, z ograniczeniem, które użytkownik, który wysłał, powinien pasować do ID obiektu użytkownika TO (gdzie bieżący użytkownik jest od użytkownika FROM) w tabeli FOLLOW. Bardziej zwięźle:
let getFollowedUsersQuery = PFQuery(className: Constants.kParseClassFollowers)
getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!)
let causesQuery = PFQuery(className: Constants.kParseClassCauses)
causesQuery.whereKey(Constants.kParseFieldFromUser, matchesKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery)
causesQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
if let causes = objects {
for cause in causes {
// populate the tableview cells, etc.
}
}
})
Teraz mam wszystkie przyczyny od użytkowników, których przestrzegam ... to całkiem niezły standard.
Oto, gdzie to staje się trudne.
Każdy Powód ma również Relację zwaną WSPIERAJĄCYMI. Teraz muszę zaprojektować sposób, aby uzyskać wszystkie przyczyny od osób, których nie śledzę, ale które mają na liście ich użytkowników, których obserwuję.
muszę jeszcze znaleźć eleganckie rozwiązanie, choć jestem zbliża się „brute force”, jeden, i to jest tak kłopotliwy i gadatliwy, że lepsza połowa mózgu mojego programatora jest screaming at me like Susan Powter ...
Oto próbka:
let retweetQuery = PFQuery(className: Constants.kParseClassCauses)
retweetQuery.orderByDescending(Constants.kParseFieldCreatedAt)
retweetQuery.whereKey(Constants.kParseFieldFromUser, notEqualTo: PFUser.currentUser()!)
retweetQuery.whereKey(Constants.kParseFieldFromUser, doesNotMatchKey: Constants.kParseFieldToUser, inQuery: getFollowedUsersQuery)
retweetQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
if let causes = objects {
for cause in causes {
let supporterRelations = cause.relationForKey(Constants.kParseClassSupporters)
let supporterQuery = supporterRelations.query()
supporterQuery.findObjectsInBackgroundWithBlock { (supporters, error) in
if(error == nil && supporters?.count > 0) {
for supporter in supporters! {
let user:PFUser = supporter as! PFUser
getFollowedUsersQuery.whereKey(Constants.kParseFieldToUser, equalTo: user)
getFollowedUsersQuery.whereKey(Constants.kParseFieldFromUser, equalTo: PFUser.currentUser()!)
getFollowedUsersQuery.findObjectsInBackgroundWithBlock({ (results, error) -> Void in
if(error == nil && results?.count > 0) {
for result in results! {
// do stuff
}
}
})
}
}
}
}
}
})
teraz, to jest czyste szaleństwo, a niezwykle rozrzutny (szczególnie biorąc pod uwagę jak Parse oblicza wolną Poziom - czuję, że to naprawdę może przyczynić się w dużym stopniu do mojego limitu API jeśli wciśnięty do produkcji).
Mając już wykonane dwa zapytania, ja przerobić jeden całkowicie, a następnie wykonaj kolejne zapytanie dla każdej przyczyny na Stosunków zwolennikiem, a następnie wykonaj kolejne zapytanie o każdego użytkownika w tej relacji, aby zobaczyć, czy ja za nimi ... i kiedy już mam te informacje, muszę przejrzeć te obsługiwane przez użytkownika przyczyny (z powodu asynchronicznego zwracania zapytań Parse, nie wydaje mi się, żebym mógł w ogóle wrócić do pętli rodzica) ... które ja jeszcze nie zaimplementowałem, bo mam zamiar rzucić ręcznik - musi być lepszy sposób!
Mam nadzieję, że mi brakuje strategii tutaj ...
Wydaje mi się, że potrzebujemy zwrotne od kibiców do przyczyn, nie? W takim przypadku polecam tabelę łączenia użytkowników USERS z CAUSES, których znajdują się na liście SUPPORTERS.To są tylko dwa pytania - uzyskaj wszystkie moje OBSERWATORA, a następnie uzyskaj przyczyny, dla których każdy UŻYTKOWNIK jest WSPIERAJĄCY, a następnie usuń duplikaty przyczyn. – tbondwilkinson
Tak, to ma sens ... Przeanalizuję to jako opcję. –
Nie znam tej struktury, ale bez zmiany semantyki można nieco uprościć składnię. Zwykle piszę "jeśli pozwalam x = y {dla i wx {..." jak "dla mnie w y? [] {... '. Zastanowiłbym się też nad zastąpieniem 'if error == nil ...' z 'guard error! = Nil else {return}'. Te dwa nie pozwolą ci zaoszczędzić wierszy, ale zaoszczędzą ci kolumn: to zmniejszyłoby twoje najskrytsze '// rzeczy do zrobienia' z 9 poziomów wcięć do 6, co nie jest * całkiem * tak szalone. –