2011-12-31 4 views
2

xcode 및 ios5에서 작업하려고했으며 Twitter API를 사용하여 짹짹을 가져 오는 TWRequest가 있습니다. 그러나 iOS5에서 블록이 어떻게 작동하는지 혼란 스럽습니다. 이 코드는 I = 짹짹했다고 가정TwitterRequest Block Syncronization IOS5

[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 

    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; 
    NSArray* firstParse = [dictionary objectForKey:@"results"]; 

    for (NSDictionary *post in firstParse) {    
     Tweet *tweetMessage = [[Tweet alloc] init]; 
     tweetMessage.message = [post objectForKey:@"text"]; 
     tweetMessage.user = [post objectForKey:@"from_user"]; 

     [tweets addObject:tweetMessage]; 
    } 
}]; 
NSLog(@"%@",[tweets count]); 

, 예를 들어 [NSMutableArray를 arrayWithCapacity을 : 25]; 어딘가에 전화 해.

그러나이 작업을 수행 할 때마다 항상 0이됩니다. 몇 가지 테스트를 한 후 NSLog가 실행 된 후 블록 코드가 실행 중이라는 것을 알았습니다. 코드가 정상적으로 작동하지 않는 것을 의미합니다.

누구든지 이러한 문제를 해결하는 방법을 알고 있습니까? 내가 배열 객체를

tweetViewController.tweets = [NSMutableArray arrayWithCapacity:25]; 
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 

    NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; 
    NSArray* firstParse = [dictionary objectForKey:@"results"]; 

    for (NSDictionary *post in firstParse) 
    {    
     Tweet *tweetMessage = [[Tweet alloc] init]; 
     tweetMessage.message = [post objectForKey:@"text"]; 
     tweetMessage.user = [post objectForKey:@"from_user"]; 

     [tweetViewController.tweets addObject:tweetMessage]; 

     NSLog(@"%d",[tweets count]); 
     //NSLog(@"%@: %@", [post objectForKey:@"from_user"], [post objectForKey:@"text"]);    
    } 
}]; 

Tweet *tweetMessage = [[Tweet alloc] init]; 
tweetMessage.message = @"HELLO"; 
tweetMessage.user = @"HELLO"; 
[tweetViewController.tweets addObject:tweetMessage]; 
return YES; 

헬로 메시지가 제대로 표시하지만 블록의 사람들이하지 않는이있는의 ViewController로 트윗을 이동하려고했기 때문에

나는이 나중에 예를 시도했다.

+0

절대적으로 필요하지 않은 경우 동기 코드를 사용하지 마십시오. –

+0

그러면 요청을 어떻게 부르겠습니까? – Jetpackman

+1

이렇게하면되지만, 비동기로 코드를 실행하도록 * 허용해야한다는 것을 의미합니다. 블록 내부에 트윗로드와 관련된 코드를 삽입하십시오. –

답변

0

하지 마십시오. 기본적으로 비동기 코드 작성에 중점을 둡니다.

트윗을 블록 대신로드하는 것과 관련된 모든 작업을 수행하십시오. (사용자 인터페이스가 더 매끄 럽습니다.) 외벽이 아닌 블록에 NSLog을 배치하십시오. 모든 트윗을로드 한 후에는 [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 또는 다른 것을 호출하여 UI를 업데이트하십시오.

tweets을 저장하는 속성에서 nonatomic 플래그를 사용하지 마십시오. 잘못된 스레드 간 액세스를 방지하려고합니다.

+0

리로드 데이터를 어디에서 호출할지 궁금합니다. 현재 앱 대리인 내 모든 작업을 수행하고 있습니다. – Jetpackman

+0

정말이 코드를 모두 사용해야합니다. 컨트롤러보기. App Delegate는 실제로이 일을해서는 안되며, 애플리케이션 자체 (시작, 종료, 일시 중지, 다시 시작 등)를 처리합니다. –

+0

performSelectorOnMainThread는 어떻게 작동합니까? 내가보기 컨트롤러에서 호출하거나보기 컨트롤러 내부에서 수행합니까? – Jetpackman