0

非同期httpリクエスト処理用のクラス「AsyncHttpRequest」を設計しました。クラス初期化子はパラメーターとしてブロックを取ります。

このブロックは、「AsyncHttpRequest」クラスの次のデリゲート実装から呼び出されます。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

   NSDictionary *dict = [NSJSONSerialization
        JSONObjectWithData:_dataResponseData //1
                   options:kNilOptions
                     error:&error];

   myBlock(dict); 

}

そして、私は次のようなViewControllerから上記のクラスのインスタンスを作成しています

- (void)viewDidLoad {
    [super viewDidLoad];
__block NSDictionary *myDic; 

AsyncHttpRequest *r = [[AsyncHttpRequest alloc] initWithUrl:urlStr withBlock:^(NSDictionary *d){

        NSLog(@"List = %@",d);  //Its working
        NSDictionary *locDic = [[NSDictionary alloc] initWithDictionary:d]; 
         // the above is working

        myDic = d; //not working

        myDic = [[NSDictionary alloc] initWithDictionary:locDic]; 
            // The above code is not working..   
     }];
}

次のエラーが発生します:エラー:アドレスにオブジェクトファイルのセクションを指すセクションが含まれていません

ブロックからプロパティまたはobj-cの外部オブジェクトにデータを保存する方法はありませんか?

ありがとう....私は過去3時間これを試しましたが、解決策が得られませんでした。

ありがとう

4

2 に答える 2

1

myDic使用される前に割り当てが解除されている可能性があると思います。

これが私の推論で-[AsyncHttpRequest initWithUrl:withBlock:]あり、ブロックをキャプチャしますが、myDic保持されません。将来のある時点で、connectionDidFinishLoadingメソッドが呼び出されますが、その時点までに、myDic変数は割り当てが解除されているため、スコープ外になります。

理にかなっていますか?

この場合、次のような解決策が考えられます。

  • myDicメソッドに渡す前に保持し-[AsyncHttpRequest initWithUrl:withBlock:]ます。注:myDicインスタンス変数である必要があります/
  • にプロパティを作成し、NSDictionaryプロパティをAsyncHttpRequestに設定しますmyDic
于 2012-11-15T22:06:08.407 に答える
0

私は解決策を見つけました。

デリゲート メソッドの実装からブロックが呼び出された場合は、エラーが発生します。

私の例では、

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
   ............
   ....... 
   myBlock(...);
 }

は NSURLConnectionDataDelegate の実装であり、上記のメソッド内からブロック関数を呼び出しました。

ブロック関数の外側で宣言された変数またはオブジェクト (プロパティまたはインスタンス変数) は、ブロック内からアクセスできません。たとえば、

__block NSDictionary *myDic; 

AsyncHttpRequest *r = [[AsyncHttpRequest alloc] initWithUrl:urlStr withBlock:^(NSDictionary *d){
    NSLog(@"List = %@",d);  //Its working
    NSLog(@"List = %@",myDic); //not working


 }];

上記のコードでは、myDic がブロックの外側で宣言されており、アクセスすると実行時エラーが発生します。

誰かが私の質問を理解せずに反対票を投じました。誰かが正しくしてくれて本当に感謝しています。

ありがとうございました....

于 2012-11-15T23:26:35.203 に答える