1

昨夜、いくつかのクラウド コードを呼び出す関数を作成しましたが、正常に動作していました。

さて、同じコードを実行すると、クラッシュが発生します...

#2  0x000000010e3e28f4 in -[PFNoObjectEncodingStrategy encodeRelatedObject:] at /Users/nlutsenko/src/parse/ios-client/Parse/Internal/PFObjectEncodingStrategy.m:17

しかし、私はこれまでにこのクラッシュを見たことがありません。

私のクラウド コード呼び出しは...

- (void)getFollowStats
{
    [PFCloud callFunctionInBackground:@"followStats" withParameters:@{@"user": self.user} block:^(NSDictionary *result, NSError *error) {
        if (error) {
            NSLog(@"Error! %@ : %@", error, error.userInfo);
        } else {
        }
    }];
}

そして、パラメータが原因でクラッシュが発生してい@{@"user": self.user}ます。ユーザー オブジェクトを削除してもクラッシュしません。しかし、これは昨夜はうまくいきました。

コールスタック全体

#0  0x00000001119a3b8a in objc_exception_throw ()
#1  0x0000000111d0ae6d in +[NSException raise:format:] ()
#2  0x000000010e3e28f4 in -[PFNoObjectEncodingStrategy encodeRelatedObject:] at /Users/nlutsenko/src/parse/ios-client/Parse/Internal/PFObjectEncodingStrategy.m:17
#3  0x000000010e428520 in +[PFInternalUtils encodeObject:withObjectEncoder:] at /Users/nlutsenko/src/parse/ios-client/Parse/Internal/PFInternalUtils.m:456
#4  0x000000010e428b63 in +[PFInternalUtils encodeObject:withObjectEncoder:] at /Users/nlutsenko/src/parse/ios-client/Parse/Internal/PFInternalUtils.m:513
#5  0x000000010e42c675 in +[PFCloud callFunctionInBackground:withParameters:] at /Users/nlutsenko/src/parse/ios-client/Parse/PFCloud.m:29
#6  0x000000010e42c9c2 in +[PFCloud callFunctionInBackground:withParameters:block:] at /Users/nlutsenko/src/parse/ios-client/Parse/PFCloud.m:56
#7  0x000000010e392712 in -[CCAccountDataSource getFollowStats] at /Users/oliverfoggin/Documents/emojicate/Emojicate/Account View/Account Data Source/CCAccountDataSource.m:48
#8  0x000000010e3922cc in -[CCAccountDataSource fetchUserDetails] at /Users/oliverfoggin/Documents/emojicate/Emojicate/Account View/Account Data Source/CCAccountDataSource.m:27
#9  0x000000010e36bb9f in -[CCAccountViewController viewDidLoad] at /Users/oliverfoggin/Documents/emojicate/Emojicate/Account View/CCAccountViewController.m:86
#10 0x0000000110353a90 in -[UIViewController loadViewIfRequired] ()
#11 0x0000000110353c8e in -[UIViewController view] ()
#12 0x0000000110377507 in -[UINavigationController _startCustomTransition:] ()
#13 0x00000001103833fe in -[UINavigationController _startDeferredTransitionIfNeeded:] ()
#14 0x0000000110383f47 in -[UINavigationController __viewWillLayoutSubviews] ()
#15 0x00000001104c9509 in -[UILayoutContainerView layoutSubviews] ()
#16 0x0000000121ef6a5e in -[UILayoutContainerViewAccessibility layoutSubviews] ()
#17 0x00000001102a7973 in -[UIView(CALayerDelegate) layoutSublayersOfLayer:] ()
#18 0x000000010ff3bde8 in -[CALayer layoutSublayers] ()
#19 0x000000010ff30a0e in CA::Layer::layout_if_needed(CA::Transaction*) ()
#20 0x000000010ff3087e in CA::Layer::layout_and_display_if_needed(CA::Transaction*) ()
#21 0x000000010fe9e63e in CA::Context::commit_transaction(CA::Transaction*) ()
#22 0x000000010fe9f74a in CA::Transaction::commit() ()
#23 0x000000010fe9fdb5 in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) ()
#24 0x0000000111c3fdc7 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#25 0x0000000111c3fd20 in __CFRunLoopDoObservers ()
#26 0x0000000111c35b53 in __CFRunLoopRun ()
#27 0x0000000111c35486 in CFRunLoopRunSpecific ()
#28 0x0000000112e9d9f0 in GSEventRunModal ()
#29 0x000000011022e420 in UIApplicationMain ()
#30 0x000000010e3970c3 in main at /Users/oliverfoggin/Documents/appName/appName/main.m:16
#31 0x0000000112237145 in start ()

パラメータ ディクショナリ

パラメータ ディクショナリを var に分割してログに記録したところ、これが得られたものです...

{
    user = "
    <PFUser: 0x7blahblha0, objectId: blahblah, localId: (null)> 
    {  
        authData = {
            facebook =  {
                "access_token" = blahblahblahblah;
                "expiration_date" = "2016-11-19T09:32:19.434Z";
                id = 1234567;
            };
        };
        avatar = "<PFFile: 0x7fc1b1c3ffb0>";
        canonicalName = "oliver foggin";
        emoji = "<PFFile: 0x7fc1b1c41170>";
        fbId = 723405322;
        friendIds = (
            8765586,
            23452345,
            2345123
        );
        fullName = "Oliver Foggin";
        onboardComplete = 1;
        username = blahblahblahblah;
    }";
}

ここからすべての安全な情報を削除し、ID 番号を変更しました。

昨日追加したビットはfriendIds配列です。しかし、それは昨日の朝に追加され、このコードは昨夜の 18:10 に機能していました。

わかりました、何ですか?これはただ奇妙です

パラメータコードをこれに置き換えました...

NSMutableDictionary *parameters = [NSMutableDictionary dictionary];

if (self.user) {
    parameters[@"user"] = [PFObject objectWithoutDataWithClassName:@"_User" objectId:self.user.objectId];
}

そのため、ユーザー オブジェクトを使用することさえせず、オブジェクト ID を持つ偽の「ユーザー」オブジェクトを作成しています。

パラメータ辞書は次のようになります...

{
    user = "<PFUser: 0x7fd770cc1020, objectId: ez0KCzD6Th, localId: (null)> {\n}";
}

そして、私はまだ同じクラッシュを起こします。

4

1 に答える 1

3

現在、PFObjects をパラメーターとしてクラウド関数に渡すことはできないと思います。NoObjectEncodingStrategy (コール スタックに表示される内部実装の詳細) は、これを明示的に禁止しています。例外には、その趣旨のエラー メッセージが含まれている必要があります。

代わりに、クラウド関数で必要なオブジェクトのオブジェクト ID を渡し、必要に応じてサーバー側で検索する必要があります。

ここでの理由は、保留中の変更または保存されていないオブジェクトを含むオブジェクトの標準形式 (たとえば、REST API for Parse を見る場合) がないため、PFObject を渡すと未定義または少なくとも予期しない動作が発生する場合が多いためです。これはいつか変わるかもしれませんが、これは混乱を避けるための制限です。

于 2014-11-22T07:43:15.703 に答える