2017-10-25 13 views
5

Tôi đang gặp sự cố thường xuyên với dự án của mình, sử dụng Máy chủ Parse. Trước tiên, tôi gọi một hàm Parse Cloud cư danh sách dữ liệu của người dùng:iOS ParseError: Đã cố gắng thay đổi một đối tượngId thành một đối tượng đã được biết đến Cửa hàng Ngoại tuyến

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

Mở mã đề cập ở trên, tôi phải thiết lập các objectId vì không có điều này, dù có bao nhiêu đối tượng tôi lấy từ màu Tây Nguyên, khi tôi giảm mảng vào một tập hợp với lệnh cuối cùng tôi kết thúc với chỉ một đối tượng trong đó.

Tuy nhiên, mặc dù công trình này, khi tôi gọi chức năng này một lần nữa để cập nhật dữ liệu của người sử dụng, tôi nhận được lỗi này trên myData.dataSource?.objectId = temp["objectId"] as? String dòng:

Đã cố gắng để thay đổi một ObjectId để một trong đó là đã được biết đến Offline cửa hàng .

Cố gắng để tìm thấy một số thông tin về nó nhưng không thật phù hợp ...

Nhờ sự giúp đỡ của bạn.

Trả lời

0

Đây không phải là thực sự là một câu trả lời, nhưng quá dài cho một lời nhận xét:

Tôi hiểu như sau:
chức năng điện toán đám mây của bạn loadData lợi nhuận success, đó là một loạt các từ điển hay, có lẽ trong trường hợp lỗi , nil. Nếu nil được trả lại, bạn không phải làm gì cả.
Nếu mảng được trả về, nó được gọi là objects.
Mảng này sau đó được ánh xạ tới một mảng các phần tử thuộc loại MyData.
Đối với mọi phần tử trở về từ chức năng điện toán đám mây, được gọi là object, một trường hợp MyData được tạo bằng như dataSourcemột trường hợpPFObject mới của lớp MyData và tài sản được đưa ra bởi từ điển đối tượng.
Tôi không hiểu câu lệnh tiếp theo mà bạn gán objectId của đối tượng được trả về từ chức năng đám mây đến PFObject mới được tạo ra: Theo như tôi biết, objectIds phải là duy nhất và không thể (hoặc ít nhất là không) được giao cho PFObjects khác.
Nhưng bạn nói bạn phải làm điều này hoặc nếu không bạn kết thúc với một yếu tố duy nhất trong tập kết quả (xem bên dưới).
Dù sao, bây giờ bạn có một số trường hợp MyData trong dataTable.
Sau đó, bạn khởi tạo dataSet, không bắt buộc vì nó sẽ bị ghi đè bằng tuyên bố cuối cùng của bạn.
Tuyên bố này tạo một tập hợp các mảng dataTable.

Bây giờ, khi bạn nhận được một phần tử trong bộ này trong trường hợp bạn không đặt thuộc tính objectId của các phần tử của mảng dataTable, điều này có nghĩa là tất cả các phần tử của mảng này đều là cùng một đối tượng. Và điều này có nghĩa là hàm init của bạn

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

lợi nhuận luôn luôn cùng một đối tượng, và đối tượng này được thực hiện để một chương trình khác bằng cách thiết lập tài sản objectId của nó. Điều này rất lạ với tôi. Vui lòng kiểm tra những gì nó đang diễn ra ở đó.

Bây giờ nếu bạn gọi loadData một lần nữa để cập nhật dữ liệu, chức năng đám mây có thể trả về một số hoặc tất cả các đối tượng trước đó một lần nữa. Trong trường hợp này, bạn sẽ chỉ định một số objectId cũ, đã được gán trước đó cho một PFObject được tạo trong hàm bản đồ, và được tạo khác, không được phép, do đó là thông báo lỗi.

Để cắt nó ngắn:
Nếu cùng một đối tượng được trả về từ các chức năng điện toán đám mây liên tục, bạn phải không tạo ra khác nhau PFObjects cho họ, và gán chúng với cùng objectId.

Tôi hy vọng điều này sẽ hữu ích!

0

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

Nếu một lớp con của PFObject phù hợp với PFSubclassing và gọi PFObject. + RegisterSubclass, khung Parse sẽ có thể sử dụng lớp đó là lớp học có nguồn gốc cho một đối tượng đám mây Parse.

Ví dụ:

1.Create lớp con lại 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 lớp dịch vụ

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

3.Configure phân tích cú pháp một lần ứng dụng ra mắt

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

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

5.It làm việc cho Cloud Chức năng

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

Lưu ý: mã nhanh chóng có thể cũ, cần có một số thay đổi nếu sử dụng phiên bản nhanh hơn.

Các vấn đề liên quan