Yani, Bir uygulamayla (iOS Swift) bir 'retweet' benzeri işlevselliği uygulama Parse kullanarak görevlendirilmiş durumda.parse.com var 'retweet' desen çok ayrıntılı olduğu
Bu, here'dan önce sorulmuştur, ancak bu, oldukça yüksek seviyeli ve b) Görevimi elimden aldım - açıkçası eksik olduğum gözükse de, mutlaka mimari kararlarda yardım istemiyorum. bir şey, geri bildirim kabul etmek için mutluyum.
Uygulamamın her biri bir USER tarafından oluşturulan CAUSES var. Ayrıca TO ve FROM kullanıcısı olan bir TAKİP tablosu vardır. Başlamak için, CAUSES tablosunu sorgulamak için KULLANICININ TAKİP tablosundaki TO kullanıcısı (geçerli kullanıcının FROM kullanıcısı olduğu) objectId ile eşleşmesi gerekir. Daha özlü:
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.
}
}
})
Şimdi ben ... hepsi oldukça standart izleyen kullanıcıların tüm nedenleri var.
Burada sorun olduğu yer.
Her bir CAUSE'nin ayrıca SUPPORTERS adlı bir İlişki vardır. Şimdi, takip etmediğim kişilerden tüm CAUSES'leri elde etmenin bir yolunu bulmalıyım, ancak takip ettiğim bir kullanıcı listesinde destekçileri var.
Bir 'kaba kuvvet' tek yaklaşan olmama rağmen ben, zarif bir çözüm bulmak için henüz var ve bu yüzden hantal ve benim programcının beyin iyi yarısı screaming at me like Susan Powter olduğunu ayrıntılı bir ... İşte
bir var numune: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
}
}
})
}
}
}
}
}
})
Şimdi, bu saf delilik, ve inanılmaz savurgan olduğunu (özellikle Ayrıştırma serbest katmanı nasıl hesapladığını dikkate - Ben üretime itilirse bu gerçekten benim API limitine ağır katkıda bulunabilir hissediyorum).
zaten bir tamamen, ardından ben onları takip olmadığını görmek için bu İlişkisi her kullanıcı üzerinde başka bir sorgu yapmak, DESTEKLEYEN İlişkiler her neden için başka bir sorgu gerçekleştirmek yinelemek, iki sorgu araştırma yapmış ... ve bu bilgilere sahip olduğumda, Kullanıcı'nın desteklediği nedenlerle döngü yapmam gerekiyor (Parse sorgularının eşzamansız olarak geri döndürülmesinden ötürü, artık ana döngülere geri dönebileceğimi hissetmiyorum). Henüz uygulanmadı, çünkü havlu atmak üzereyim - daha iyi bir yolu olmalı!Ben burada bir strateji eksik umut ... Bu ise üzgünüm jesses.co.tt @
Bana göre bir ihtiyaç destekçilerden backlink nedenleri, hayır? Bu durumda, KULLANICILARININ DESTEKÇİLER listesinde bulunan NEDENLERİNİN bir bağlantı tablosunu öneririm.Sonra sadece iki sorgu var - tüm TAKİPÇİLERİMİZİ al ve sonra her bir KULLANICI'nın bir DESTEKLEYİCİ olduğu nedenleri al ve sonra yinelenen nedenleri ayıkla. – tbondwilkinson
Evet, bu mantıklı ... Bunu bir seçenek olarak keşfedeceğim. –
Bu çerçeveye aşina değilim, ancak semantiği değiştirmeden sözdizimini biraz daha basit hale getirebilirsiniz. Genelde "eğer x için y izin veririm? {I" için x için ... [] {... '. Ayrıca, eğer 'error error == nil ...' 'guard error! = Nil else {return}' ile değiştirmeyi düşünürdüm. Bu ikisi de sizi kurtaramazlar, fakat sizi sütunlardan kurtarırlar: bu, en içteki // bir şeyi girintinin 9 seviyesinden 6'ya düşürecektir. –