2013-05-20 3 views
0

NSMutableArray에 중대한 문제가 있음을 알았습니다. 아마도 나는 정말 분명한 것을 놓치고있을 것입니다. 아마도 나는 그것을 볼 수 없을 정도로 많이 보았을 것입니다. 그것은 완벽하게 작동 나는 등 할 개체를 검색, 내가 그것을 표시 한 코드 내에서 배열을 볼 수 있습니다NSMutableArray는 비어 있지만 채워집니다.

@synthesize testArray; 

- (void)viewDidLoad{ 

     [super viewDidLoad]; 

     testArray = [[NSMutableArray alloc] init]; 

     TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://search.twitter.com/search.jsonq=kennedy&with_twitter_user_id=true&result_type=recent"] 
     parameters:nil requestMethod:TWRequestMethodGET]; 

     [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) 
     { 
     if ([urlResponse statusCode] == 200) { 

      // The response from Twitter is in JSON format 
      // Move the response into a dictionary 
      NSError *error; 
      NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; 
      NSArray *results = [dict objectForKey:@"results"]; 

      //Loop through the results 
      for (NSDictionary *tweet in results) { 

       tweetStore *tweetDetails = [[tweetStore alloc] init]; 
       NSString *twitText = [tweet objectForKey:@"text"]; 

       //Save the tweet to the twitterText array 
       tweetDetails.name = @"test"; 
       tweetDetails.date = @"test"; 
       tweetDetails.tweet = twitText; 

       [testArray addObject:tweetDetails]; 
      } 

      tweetStore *retrieveTweet = (tweetStore*)[testArray objectAtIndex:0]; 
      NSLog(@"tweet is: %@", retrieveTweet.tweet); 
      //NSLog(@"Array is: %@", testArray); - *can* view Array etc here 
     } 

     else { 
       NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]); 
     } 
    } 
    ]; 


    NSLog(@"test array: %@", testArray); //Array is now empty...... 
} 

:

가있는 NSMutableArray를 채우는 결과를 사용하여 다음 몇 가지 트윗을 읽고 있습니까 . 하지만이 배열 밖에서 배열에 액세스하거나 표시하려고하자마자 비어있는 것처럼 보입니다. 어떤 도움이나 조언을 부탁드립니다.

+4

콜백 블록을 사용하여 비동기 호출을하고 있습니다. 요청이 완료되면 배열이 채워지지만 응답을받은 후가 아니라 "언젠가는 미래에"완료되도록 호출을 설정 한 직후에 체크합니다. –

+0

@JoachimIsaksson에 동의합니다. 그것은 타이밍 문제입니다. – trojanfoe

+0

그것의 해제/할당 해제 점점 .. –

답변

0

문제는 블록의 코드가 비동기 방식으로 수행되므로 NSLog 코드 뒤에 이 실행됩니다.

  • 먼저 당신이 초기화를 수행 :

    실행 코드는이 흐름을 다음과

    [super viewDidLoad]; 
    
    testArray = [[NSMutableArray alloc] init]; 
    
    TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString:@"http://search.twitter.com/search.jsonq=kennedy&with_twitter_user_id=true&result_type=recent"] 
    parameters:nil requestMethod:TWRequestMethodGET]; 
    
  • 당신은 요청을 시작합니다

    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { <block_code> } ]; 
    
  • 당신 인쇄 배열 정보 및 비어 있습니다 (올바른) :

    NSLog(@"test array: %@", testArray); 
    

지금 비동기 요청이 종료되고, 블록의 코드가 실행된다 : 따라서 배열은 블럭 코드에 제대로 설치된다.

관련 문제