2013-09-05 3 views
0

나는이 문제를 해결하기 위해 여전히 새로운 목표를 가지고 있습니다. -c &. 다음과 같이 말하면됩니다.테이블 뷰 셀에서 responseObject에 액세스 할 수있게 만들기

나는이 방법을 잘못 사용하고 있지만 기본적으로 특정보기를 표시 할 컨트롤러가 있습니다.

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     [[CustomAPIClient sharedClient] getPath:@"/api/profile" parameters:[NSDictionary dictionary] success:^(AFHTTPRequestOperation *operation, id responseObject) { 

     }]; 

     **//Now, how do I get my responseObject out here??** 
    } 

그래서 제 질문은 다음과 같습니다 :

  1. 가 어떻게 그 블록의 외부 responseObject를 얻을 수 있습니다 또한이 같은 다른 컨트롤러가 있습니까?
  2. [[CustomAPIClient... 블록을 호출하지 않고 인증 상태를 유지할 수있는 방법이 있습니까?

미리 감사드립니다.


내가하는 일에 대해 더 잘 설명하고 싶습니다.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.meResponseObjectFromAboveCode count]; 
} 

그래서 내가 무슨 내 응답 객체가 블록이 실행 단위

답변

0

내 테이블보기에 표시 할 : 나는 테이블 뷰 세포를 가지고있다. 이 경우이 메서드는 요청이 성공적으로 반환되면 실행할 수있는 블록을 제공합니다. 따라서 우선 네트워킹 클라이언트에게 코드를 제공하고 "완료 될 때마다 실행하고 싶습니다."라고 말합니다. 이론적으로 responseObject을 "여기에"놓는 것이 가능하다면, getPath 메서드가 실행 된 후에 나중에 실행할 블록을 저장하기 때문에 (적어도 나중에 원하는대로) 블록을 저장하기 때문에 0이 될 것입니다. 그 방법 바로 다음에 코드를 실행하기 시작합니다. 기본적으로 네트워크 요청을 발행 한 직후에 실제로 요청할 시간이 없으므로 돌아가서 responseObject을 사용할 수있게 만듭니다.

두 번째 블록은 클로저입니다. 의미, 그것은 자신의 범위 밖의 변수를 캡처하지만 그 안에 전달되거나 그 안에 초기화 된 것은 그 안에 "동봉"되어 있으며 그 내부에서 보이지 않습니다. 이제

, 당신은 당신이 블록의 내부 변경할 수 있습니다 (때문에 __block 수정의) 다음 __block id veryBadIdea; 같은 getPath과를 호출하기 전에 변수를 선언하여이 문제를 얻을 수 있습니다,이 점은 매우 명확하게합니다. 따라서이 나쁜 아이디어 예에서는 veryBadIdea = responseObject을 수행 한 다음 getPath 다음에 NSLog(@"%@", veryBadIdea);을 수행하고 이것이 0이라는 것을 알 수 있습니다. 왜? NSLog가 호출 될 때까지 네트워크 요청은 으로 전송되지 않았을 가능성이 큽니다. veryBadIdea가 responseObject의 값으로 할당 될 때까지 viewDidLoad은 오래 동안 완료되어 반환되었습니다.

블록 내에서 responseObject을 사용하면 사용할 수있는 곳이 어디에서 발생하든 사용하는 코드가 실행되는 곳이됩니다.

+0

그래, 대부분의 경우 테이블보기를 담당하는보기 컨트롤러는 대리인 및 데이터 원본 역할을합니다. 테이블에 표시해야하는 데이터의 배열이 인스턴스 변수에 저장됩니다. 뷰 컨트롤러가 나타내는 화면이 처음 표시 될 때 해당 배열은 비어 있으므로 테이블보기도 비게됩니다. 이 시점에서 적재 표시기를 올릴 수 있습니다.그런 다음 getPath 요청을 실행 취소하고 성공 블록에서 배열에'responseObject' 내용을 채우고 테이블보기에서'reloadData'를 호출하고 회 전자를 숨 깁니다 – atomkirk

+0

블록 내에서 인스턴스 변수를 수정할 수 있습니다 __block 키워드를 사용하지 않고 NSArray가 스레드로부터 안전하지 않은 경우, 테이블 스레드를 읽는 데 사용되는 동일한 위치 인 주 스레드에서 수정하는 경우에만 확인하십시오. 메인 쓰레드에 블록을 다시 넣는 예 :'[[NSOperationQueue mainQueue] addOperationWithBlock :^{// 여기 메인 큐를위한 코드}]; ' – atomkirk

+0

고맙습니다. 너는 큰 도움이되었다. – goo

관련 문제