0

こんにちは、ParseLiveQuery 経由でオブジェクトを取得しようとしています

ParseLiveQuery は Pointer Object をサポートしていないと思います。

これが私のコードのスニペットです。

Post.swift

import Foundation
import Parse

class Post: PFObject, PFSubclassing {

    @NSManaged var postBy: PFUser?
    @NSManaged var postText: String?
    @NSManaged var postImg: PFFile?


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



    override class func query() -> PFQuery<PFObject>? {
        //1
        let query = PFQuery(className: Post.parseClassName())

        query.whereKeyExists("objectId")
        //2
        query.includeKeys(["postBy"])
        //3
        query.order(byDescending: "createdAt")
        return query
    }

}

extension Post: FeedCellSupport {

    var username:String?{

        return postBy?["username"] as? String


    }

    var userImg:PFFile?{

        return postBy?["profileImg"] as? PFFile
    }

FeedVC.swif

    let liveQueryClient = ParseLiveQuery.Client()

    protocol FeedCellSupport {

        var username:String?{ get }
        var userImg:PFFile?{ get }


        var postText: String? { get }

    }


class FeedVC: UITableViewController, ShopDetailDelegate {

    private var subscription: Subscription<Post>!

    //Add friends and me
    var postLiveQuery: PFQuery<Post> {
        return (Post.query()?
            .whereKeyExists("objectId")
            .includeKeys(["postBy", "commentBy", "commentBy.commentBy"])
            .order(byAscending: "createdAt")) as! PFQuery<Post>
    }


    var results = [Post]()


    override func viewDidLoad() {
        super.viewDidLoad()
 subscription = liveQueryClient.subscribe(postLiveQuery).handleSubscribe { [weak self]  (_) in
            // Fetch the objects on subscription to not miss any
            self?.fetchObjects()
            }.handleEvent { [weak self] (_, event) in
                self?.handleEvent(event: event)
        }

}

2つ質問があります。

1. ParseLiveQuery は、REST の結果のような PFObject を返しました。

オブジェクトを初めてフェッチすると、正常に動作します。

つまり、findObjectBackground を介してユーザー名と userImg のデータを取得できます。

<Post: 0x6180000b43a0, objectId: w5qcfMCByF, localId: (null)> {
likeCount = 0;
postBy = "<PFUser: 0x6180000f4600, objectId: rgG7XfAYWj, localId: (null)>";
postImg = "<PFFile: 0x618000246ba0>";
postText = nice2MeetYous121;
sell = 0;
}

更新されたイベントを受け取った後、異なるスタイルの PFObject を取得しました。

<Post: 0x6100000b3020, objectId: w5qcfMCByF, localId: (null)> {
"__type" = Object;
className = Post;
createdAt = "2016-11-19T12:37:30.896Z";
likeCount = 0;
postBy = {
"__type" = Pointer;
className = "_User";
objectId = rgG7XfAYWj;
};
postImg = {
"__type" = File;
name = "92aa66bfdcf5f70d1d277556bbd9d7ca_post.jpg";
url = "https://parsefiles.back4app.com/PlY72cbRxsOIXQ1qbJjaQtudZQU9HA8U2RIg2oE1/92aa66bfdcf5f70d1d277556bbd9d7ca_post.jpg";
};
postText = nice2MeetYous1211;
sell = 0;
updatedAt = "2016-11-21T14:34:11.338Z";
}

Parse LiveQuery が REST のように返されたため、エラー メッセージが表示されました。

2. 「fix-object-decode」のブランチを試したところ、REST スタイルではなく PFObject が返されました。しかし、ポインタ データを直接取得することもできません。

ios ParseLiveQuery リンク branch->fix-object-decode

「fix-object-decode」ブランチをテストしました。

適切にフォーマットされた PFObject を返しましたが、結果が異なるようです。

findObjectInBackGround() 経由でリクエストすると、元の PFObject になります

<Post: 0x6080000b0800, objectId: w5qcfMCByF, localId: (null)> {
likeCount = 0;
postBy = "<PFUser: 0x6080000e3100, objectId: rgG7XfAYWj, localId: (null)>";
postImg = "<PFFile: 0x60800024c150>";
postText = nice2MeetYous1211;
sell = 0;
}

postText を変更すると、ライブクエリを介して更新イベントを取得しましたが、異なります。

<Post: 0x6100000b1be0, objectId: w5qcfMCByF, localId: (null)> {
likeCount = 0;
postBy = "<PFUser: 0x6100000e6900, objectId: rgG7XfAYWj, localId: (null)>";
postImg = "<PFFile: 0x61000025d1f0>";
postText = nice2MeetYous;
sell = 0;
}

ご覧のとおり、PFUser:0x6080000e3100 および PFFile: 0x60800024c150 が PFUser: 0x6100000e6900、PFFile: 0x61000025d1f0 に変更されました。

とにかく、イベントを受け取ったときに fetchObject を取得できません。

この問題はライブ クエリに関するものですか、それとも解析サーバー側の問題ですか?

キャッチされない例外'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'キー "ユーザー名" にデータがありません。値を取得する前に fetchIfNeeded を呼び出してください。

fetchIfNeeded エラーを回避するためにコードを追加しました。

これが私のスニペットコードです。

extension Post: FeedCellSupport {

var username:String?{

    do {
        try postBy?.fetchIfNeeded()
    } catch _ {
        print("There was an error")
    }


    return postBy?["username"] as? String


}

var userImg:PFFile?{
    do {
        try postBy?.fetchIfNeeded()
    } catch _ {
        print("There was an error")
    }

    return postBy?["profileImg"] as? PFFile
}

今は正常に動作しますが...システムは「警告:メインスレッドで長時間実行されている操作が実行されています。」

私はそれが最良の方法ではないと思います..

誰か助けてくれませんか?

4

1 に答える 1

0

解析サーバーが includekey をサポートしていないことに気付きました。

于 2016-11-26T07:29:39.367 に答える