2016-01-06 20 views
43

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 @

+4

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

+1

Evet, bu mantıklı ... Bunu bir seçenek olarak keşfedeceğim. –

+2

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. –

cevap

1

biraz geç, ben kesinlikle bu cevap veriyorum dikkat çekmek aylar sorulduktan sonra, ama bunun genel olarak cevaplamaya değer olduğunu düşünüyorum (ve belki de sizin için hala değerli olabilir).

Genel olarak,% 100'ü, Parse ile olan üçlü sorgulamanın a) faturalandırılma şeklini (eski sistemde) büyük ölçüde etkisiz hale getireceğini ve b) bununla birlikte yanlış bir yaklaşım gibi göründüğünü kabul ediyorum. Kendiliğinden barındırılan Parse (Parse şimdi kapatıldığından beri bu noktada kullanılabilen tek mekanizmadır, ama sanırım sorusu sorulduğunda da muhtemelen devam etmiş olurdum ... ne olursa olsun ...). Bunu, genel şemaya/mimariye yapılabileceğini varsayarak, bunu oldukça temiz bir şekilde çözebilecek 2 çözüm var.

1) bir birinci çözelti esas olarak yeniden şematize veri seti ve "yabancı anahtar" her UserUser tablo kendisinde yer alır destekçileri alt kümesi için. Bu şekilde,->Supporter ->User'dan çıkmak yerine, teorik olarak Cause ->User yapabileceksiniz (kullanıcılardan, destekleyicilerini varsayılan olarak bir sütun olur). Bunu doğru olarak hatırlıyorum, doğru bir şekilde hatırlıyorum, bir değer olarak belirli bir tür dizisine sahip olacak bir sütun ve daha sonra (bu Parse panosunda güzel görünecek)bağlantı var gerçek bir Supporter tablo nesneler, ancak bu tablonun bağlantılarını User tablonuzda tutuyor. el ben yazma kendinizi o otomatik gerektiğini, bunun için kod anlamına tarafından (el ile yapmak gerekecek ama olmayacak çünkü

iken, write tarafta biraz daha fazla bir iştir kalkınma açısından ücretsiz olarak gerçekleşir). Bu biraz daha açık write işlemi ile, daha sonra bir 2 adım read yerine bir ikinci çözelti sorgu hızı ise, bu tür veriler için farklı bir sağlayıcı kullanmaktır 3.

2) sahip sorun. çok daha bir Parse gibi ama uzakta olmanın Firebase (çok farklı "Tüm kapsayıcı" seviyelerini, Firebase hem benim projelerin birkaç ben veri sorgulama arama bu tür soket tabanlı yaklaşımlar kullanın ve Pusher veya gibi düşünen Google bu sefer Pusher biraz daha temel ve "DIY"). Firebase örneğin, ve bu veri seti + Cause tablonun kendisi User ler kendilerine (ve hangi User ait ne bir önbellek sahip olduğu bir şemaya bir yuvaya sahip

onların Supporter s'lik bir önbellek vardır), bu 3 adımlı görünüm 2 parametre ile etkili bir şekilde 1 sorgu olabilir (ki bu da ideal senaryo olduğunu düşünüyorum). Bunun Parse ile de elde edilebileceğine inanıyorum, ancak önerilen ilk çözüm için bir başka şema adımı gerektirecektir.

Sanırım bu yorumlara benzer bir şey (her iki çözümün üstünde) önerilir, ancak çok daha ayrıntılı bir biçimde. Umarım bu, asıl soru-cevapçıya veya birine yardımcı olur. Birisi tavsiye edildiği bu da teorik olarak, söz 1 yorum olarak PubNub kullanabilirsiniz, ancak aynı kolaylıkla bu DB AWS barındırılan bir PostgreSQL içine şema veya Heroku inşa edebileceğini ve olmadan Parse tamamen aynı mekanizmalarını başarmak havai. Ayrıca

, bu artık sadece bir Açık Kaynak kendini barındırılan bir çözüm olarak sunulmaktadır hangi Ayrıştırma referans olması nedeniyle, burada bir kendi AWS üzerine Ayrıştırma barındırma geçmek için de bir kılavuz: link here

+0

Harika cevap, yakında tekrar ziyaret edecek! Teşekkürler! –