1

以下のような私のプロジェクトのソースコード。

最初のブロックはオブジェクトを返し、2 番目のブロックはオブジェクトがパラメーターとして渡される必要があります

 [kNetManagerInstance exeHttpRequest:anUrl requestFrom:self withParseBlock:^id(NSData       *htmlData) {
        NSMutableArray *arr = doSomeParsingWorkOn(htmlData); 

        return arr; //return the html parsed result for the seconde block to use.

    } andResultBlock:^(id object) {


        NSLog(@"%@",object);//can output the object but
        //crash  when execute out of the scope,EXC_BAD_ACCESS(code=2,address=0xc)  
    }]; 

上記のメソッドは、以下のようなことを行います。

 -(id)init:(NSString *)url
        withParseBlock:(htmlParseBlock)parseBlock
        andResultBlock:(ItemsReturnBlock)resultBlock
   {
    self = [super init];
    if(self!=nil){

         [_parseBlock release];
        _parseBlock = [parseBlock copy];

        [_returnBlock release];
        _returnBlock = [resultBlock copy];

        _asiRequest = [[ASIHTTPRequest alloc ] initWithURL:[NSURL URLWithString:url]];

        __block HttpParseSession * self_ = self;
      dispatch_queue_t httpQueue =    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, nil);
        dispatch_block_t block = ^{
            @autoreleasepool {
                 [self_ start];
            }
        };
        if(dispatch_get_current_queue()==httpQueue){
            block();
        }else{
            dispatch_async(httpQueue, block);
        }


    }
    return self;

}

httpQueue で呼び出されるメソッド
-(void)start{

    [_asiRequest startSynchronous];
     NSData *data = _asiRequest.responseData;
    __block id result = _parseBlock(data); //get the parsed result
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    if(dispatch_get_current_queue()==mainQueue){
        _returnBlock(result);
    }else{

        dispatch_async(mainQueue, ^{

            _returnBlock(result); 


        });
    }

}
4

0 に答える 0