2

このコードは機能します

[[MyManager sharedManager] makeRequestAndParsingfor:someParameters 
                                            success:^(NSDictionary * dictionary){
                                                // Sucessful response
                                                NSLog(@"Success!!");
                                            } 
                                            failure:^(NSError* error){ 
                                                // Error response
                                                NSLog(@"Failure!");    
                                            }];

しかし、これはバックグラウンドで同じことを実行するたびに、成功ブロックまたは失敗ブロックに入ることはありません。

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    [[MyManager sharedManager] makeRequestAndParsingfor:someParameters 
                                                success:^(NSDictionary * dictionary){
                                                    // Sucessful response
                                                    NSLog(@"Success!!");
                                                } 
                                                failure:^(NSError* error){ 
                                                    // Error response
                                                    NSLog(@"Failure!");    
                                                }];
}];

誰が何が起こるか説明できますか? メソッドmakeRequestAndParsingfor : (再びブロックを使用して) 非同期リクエストを作成し、結果を解析します。私のデバッガーは、2 番目のケースでは成功/失敗しないことを示しています。最初のケースでは、それは魅力のように機能します。何か案は?

4

1 に答える 1

1

メソッド 'makeRequestAndParsingfor' は引数の block_copy() を使用し、戻り値を強力な変数に格納しますか (ヒープ内のブロックを取得するため)? また、asserts() を追加して、'makeRequestAndParsingfor' で両方のブロックを取得できることを確認し、どちらかを呼び出す前に再テストすることもできます。[以前は block_copy() の使用が必要でしたが、現在は 100% 確実ではありません。]

'makeRequestAndParsingfor' が同時キューで実行される 2 番目のケースでは、これらの複数がブロックを同時に呼び出すことができることに注意してください。 「makeRequestAndParsingfor」のメイン キュー (同様に構築したアプリで行います)。

于 2012-09-27T13:39:29.613 に答える