0

ブロックをコールバック ハンドラーとして使用したいのですが、アプリがクラッシュしているため、自分が行っていることが適切かどうかわかりません。これが私がやっていることです:

私の FirstViewController では、クラス FirstModel のメソッドを呼び出して、次のようにサーバーからデータを取得しています。

//In FirstViewController.m
[aFirstModelObj retreiveDataWithCallBackHandler:^(NSDictionary *responseDict){

   //Data is received so we can proceed...
}];

//In FirstModel.m
typedef void(^newBlock)(NSDictionary *);
    newBlock theBlock;

-(void)retreiveDataWithCallBackHandler:(void(^)(NSDictionary *))aBlock
{
    //Saving "aBlock" for further use..
    theBlock = aBlock;

    //Server Processor will retrieve data using URL asynchronously,
   //initializing ServerProcessor object and providing FirstModel its delegate,so that when data is received in ServerProcessor class FirstModel's receivedResponse method will get called.

    serverProcessorObj.delegate = self;

}

-(void)receivedResponse:(NSDictionary *)responseDict
{
   //once data is received call block,
   theBlock(responseDict);
}

デリゲートを失っているため、アプリがクラッシュしています。ServerProcessor から [delegate receivedResponse:response] を呼び出すと、exc bad access と表示されます。誰が私が間違っているのか教えてもらえますか?

前もって感謝します!

4

2 に答える 2

0

コードを修正しました。

-(void)retreiveDataWithCallBackHandler:(void(^)(NSDictionary *))aBlock
{
    //Saving "aBlock" for further use..
    theBlock = Block_copy(aBlock);

    //Server Processor will retrieve data using URL asynchronously,
    //initializing ServerProcessor object and providing FirstModel its delegate,so that when data is received in ServerProcessor class FirstModel's receivedResponse method will get called.

    serverProcessorObj.delegate = self;

}

-(void)receivedResponse:(NSDictionary *)responseDict
{
   //once data is received call block,
   if (theBlock)
       theBlock(responseDict);
}
于 2013-11-22T09:40:59.667 に答える
0

ブロックが nil でないことを確認する以外に (コメントに従って)、おそらく次のことと関係があります。

上記のアプローチでは、一度に 1 つの非同期リクエストしか処理できません。同時リクエストを処理しようとしていますか? 後続のリクエストは、前のリクエストのブロックをオーバーライドします。これにより、問題が発生する可能性があります。

同時リクエストをサポートする必要がある場合は、リクエストの完了時に を呼び出すことができるように、現在実行中のリクエストの各ブロックを保持する必要があります。

次のようなオブジェクトを渡していた場合:

retreiveDataForCustomer:(Customer*)customer onSuccess:(void (^)(NSDictionary*))success

. . . 次に、顧客オブジェクトにプロパティまたは連想参照を作成して、ブロックを保持することをお勧めします。ただし、呼び出しにはパラメーターがないため、どのブロックがどのデリゲート呼び出しに対応するかを追跡する別の方法を見つける必要があります。

于 2013-10-11T07:54:20.667 に答える