2017-10-25 19 views
5

Parse Server kullanarak projemde düzenli bir sorun yaşıyorum. Birincisi, bir kullanıcının veri listesini doldurmak için bir Ayrıştırma Bulut işlevini çağırır: Yukarıda belirtilen KoduiOS Ayrıştırma: Çevrimdışı Mağaza için bilinen bir nesneye değiştirmeyi denediniz.

var dataSet: Set<MyData>? 

func loadData(withParameters parameters: [String : Any]) { 

     PFCloud.callFunction(inBackground: "loadData", withParameters: parameters) { (success, error) in 

      if let objects = success as? [[String : Any]] { 

       let dataTable: [MyData] = objects.map({ (object) -> MyData in 

        let myData = MyData(dataSource: PFObject(className: "MyData", 
             dictionary: object)) 
        myData.dataSource?.objectId = object["objectId"] as? String 
        return myData 
       }) 

       if self.dataSet == nil { 
        self.dataSet = [] 
       } 

       self.dataSet = Set(dataTable) 
      } 
     } 
    } 

, Ne olursa olsun ben Parse, alımın kaç nesneler, bu olmadan çünkü objectId belirlemek zorunda zaman diziyi son komutla bir kümeye indirgeyim, sadece bir nesne ile bitiyorum. Bu çalışmasına rağmen kullanıcı verilerinin güncellenmesi fonksiyonunu tekrar çağırdığınızda

Ancak, ben myData.dataSource?.objectId = temp["objectId"] as? String satırda bu hatayı alıyorum: zaten Çevrim Store'a bilinen birine bir objectId değiştirmeye teşebbüs

.

bazı bunun ancak çok alakalı hiçbir şey hakkında bilgi ... Yardımlarınız için

Teşekkür bulmaya çalıştı. Aşağıdakileri anladım

:

cevap

0

Bu hayır gerçekten bir cevap ama bir yorum için çok uzun
Bulut fonksiyonu loadData döner muhtemelen bir hata durumunda, sözlükler bir dizidir ya success, , nil. nil döndürülürse, hiçbir şey yapmazsınız.
Bir dizi döndürülürse, objects olarak adlandırılır.
Bu dizi daha sonra MyData türünde bir dizi öğeye eşlenir. her eleman için
bir MyData örneği dataSourceolarak hedef sözlük tarafından verilen bir sınıf MyData ve özellikler taşıyan yeni birPFObject örneği kullanılarak oluşturulan edilir object olarak adlandırılan, bulut fonksiyonu döndü.
Bulut işlevinden döndürülen nesnenin objectId öğesini yeni oluşturulmuş PFObject olarak atadığınız bir sonraki ifadeyi anlamıyorum: Bildiğim kadarıyla, objectIds benzersiz olmalı ve (en azından olmamalı) benzersiz olmalıdır. diğer PFObjects'a atanmıştır.
Ama bunu yapmanız gerektiğini söylediniz ya da sonuçta ortaya çıkan sette tek bir elemanla sonuçlanacaksınız (aşağıya bakınız).
Neyse, şimdi dataTable numaralı MyData örneğiniz var.
Daha sonra, dataSet'u başlatırsınız; bu, son ifadeniz tarafından üzerine yazılacağı için gerekli değildir.
Bu ifade, dataTable dizisini oluşturur.

dataTable dizisinin öğelerinin objectId özelliğinin ayarlanmaması durumunda, bu kümede tek bir öğe aldığınızda, bu, bu dizinin tüm öğelerinin aynı nesne olduğu anlamına gelir. Ve bu her zaman

MyData(dataSource: PFObject(className: "MyData", 
             dictionary: object)) 

döner aynı nesne ve bu nesnenin onun objectId özelliğini ayarlayarak farklı birine yapılır İnit fonksiyonu anlamına gelir. Bu benim için çok garip. Lütfen neler olduğunu kontrol edin.

Verileri güncellemek için bir kez daha loadData numaralı telefonu arayacak olursanız, bulut işlevi muhtemelen önceki nesnelerin bir kısmını veya tümünü yeniden döndürür. Bu durumda, daha önce bir objectId, daha önce atanmış olan PFObject, harita fonksiyonunda oluşturulmuş bir başka yeni PFObject oraya yaratılmış, buna izin verilmeyen, yani hata mesajını atayacaktır. Aynı nesne defalarca bulut işlevinden dönerse
, onlar için farklı PFObjects oluşturmamalıdır ve onlara aynı objectId atayın:

kısa kesmek için.

Umarım bu yardımcı olur! PFObject bir alt sınıfı PFSubclassing uygundur ve PFObject. + RegisterSubclass çağırır

0

http://parseplatform.org/Parse-SDK-iOS-OSX/api/Protocols/PFSubclassing.html

, Ayrıştırma çerçeve bir Ayrıştırma bulut nesnesi için doğal sınıf olarak bu sınıfı kullanmak mümkün olacaktır. Örneğin

:

PFObject

import Parse 

class Question: PFObject, PFSubclassing { 

    @NSManaged var category: String? 
    @NSManaged var text: String 
    @NSManaged var image: PFFile? 
    @NSManaged var answerType: String 
    @NSManaged var order: NSNumber 

    static func parseClassName() -> String { 
     return "Question" 
    } 
} 

class User: PFUser { 

    @NSManaged var fullname: String 
} 

2.Register alt sınıf

extension Parse { 
    class func registerSubclasses() { 
     User.registerSubclass() 
     Question.registerSubclass() 
    } 
} 

3.Configure ayrıştırma hizmeti sizin alt sınıf uygulaması

Parse.registerSubclasses() 
Parse.enableLocalDatastore() 
Parse.setApplicationId(PARSE_APP_ID, clientKey: PARSE_APP_KEY) 
kez başlattığında 1.Create 4.Now PFUser == User

, Question == PFObject(className: "Question")

5.It Bulut Fonksiyonu için

PFCloud.callFunctionInBackground("fetchQuestions", withParameters: parameters) { questions, error in 
      if let questions = questions as? [Question] { 
       completion?(questions, nil) 
      } else { 
       completion?(nil, error) 
      } 
     } 

Not çalışır: Daha yüksek hızlı sürümünü kullanarak eğer hızlı kod eski olabilir, bazı değişiklikler olmalıdır.

İlgili konular