2017-10-25 53 views
5

Mam regularny problem z moim projektem, używając serwera analizy składni. Po pierwsze, wywołać funkcję Parse Cloud zapełnić listę danych użytkownika:iOS ParseError: Próba zmiany obiektu ID na taki, który jest już znany w sklepie offline.

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) 
      } 
     } 
    } 

na kodzie wspomniano powyżej, muszę ustawić objectId bo bez tego nie ma znaczenia ile przedmiotów ja pobrać z Parse, kiedy zmniejsz tablicę do zestawu z ostatnią instrukcją, którą kończę z jednym tylko obiektem.

Jednak mimo to działa, gdy zgłoszę tę funkcję ponownie zaktualizować dane użytkownika, otrzymuję ten błąd na myData.dataSource?.objectId = temp["objectId"] as? String line:

Próbowano zmienić objectID jednego, który jest już znany do Sklepu Online .

próbowali znaleźć jakieś informacje o tym, ale nic bardzo istotne ...

Dzięki za pomoc.

Odpowiedz

0

To nie jest naprawdę odpowiedź, ale zbyt długo na komentarz:

Rozumiem, co następuje:
czynność cloud loadData powraca success, która jest tablicą słowników lub, prawdopodobnie w przypadku błędu , nil. Jeśli zostanie zwrócone nil, nic nie zrobisz.
Jeśli zwracana jest tablica, jest ona określana jako objects. Ta macierz jest następnie mapowana na tablicę elementów typu MyData.
dla każdego elementu zwrócony od funkcji chmura nazywana object instancja MyData jest tworzony przy użyciu jako dataSourcenowyPFObject przykładem grupy MyData i właściwości podane przez Dictionary.
Nie rozumiem następnej instrukcji, do której przypisano obiekt objectId obiektu zwróconego z funkcji chmury do nowo utworzonego PFObject: Z tego co mi wiadomo, objectIds musi być unikalny i nie może (lub przynajmniej nie powinien) być przypisane do innych PFObjects.
Ale powiedziałeś, że musisz to zrobić, bo inaczej skończysz z pojedynczym elementem w wynikowym zestawie (zobacz poniżej).
W każdym razie masz teraz tablicę instancji MyData w dataTable.
Następnie należy zainicjować dataSet, co nie jest wymagane, ponieważ zostanie ono nadpisane przez ostatnie polecenie.
Ta instrukcja tworzy zestaw z tablicy dataTable.

Teraz, gdy pojawi się pojedynczy element w tym zestawie na wypadek, gdyby nie ustawiono właściwości objectId elementów z macierzy, oznacza to, że wszystkie elementy tej tablicy są tym samym obiektem. I oznacza to, że funkcja startowych

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

powraca zawsze do tego samego obiektu, a obiekt ten jest wykonany na inny poprzez ustawienie jej objectId nieruchomości. To bardzo dziwne. Sprawdź, co tam się dzieje.

Teraz, jeśli ponownie zadzwonisz pod numer loadData, aby zaktualizować dane, funkcja chmury prawdopodobnie ponownie przywróci niektóre lub wszystkie poprzednie obiekty. W takim przypadku można przypisać stare objectId, które zostało już wcześniej przypisane do PFObject utworzonej w funkcji mapy, do nowo utworzonego tam PFObject, co jest niedozwolone, a więc komunikat o błędzie.

wyciąć go krótko:
Jeśli ten sam obiekt jest zwracany z funkcji cloud wielokrotnie, nie wolno tworzyć inny PFObjects dla nich, i przypisać im tę samą objectId.

Mam nadzieję, że to pomoże!

0

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

Jeśli podklasą PFObject zgodny PFSubclassing i wzywa PFObject. + RegisterSubclass, analizować ramy będą mogli używać tej klasy jako rodzimej klasie chmurze obiektu Parse.

Na przykład:

1.Create swoją podklasę 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 podklasy usług

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

3.Configure parse raz aplikacja uruchamia

Parse.registerSubclasses() 
Parse.enableLocalDatastore() 
Parse.setApplicationId(PARSE_APP_ID, clientKey: PARSE_APP_KEY) 

4.Now PFUser == User, Question == PFObject(className: "Question")

5.It pracuje dla funkcji Chmura

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

Uwaga: swift kod może być stary, nie powinno być pewne zmiany w przypadku korzystania z nowszej wersji szybkiej.