2011-12-31 76 views
2

我正試圖在xcode和ios5上工作,並且我有一個TWRequest來使用Twitter Api降低推文。不過,我對iOS5中的塊如何工作感到困惑。例如在此代碼中TwitterRequest塊同步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]); 

假設我有一個tweets = [NSMutableArray arrayWithCapacity:25];打電話給某個地方。

但是,每次我這樣做,計數總是爲零。在做了一些測試之後,我意識到在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; 

的Hello報文正常顯示,但該塊中的那些做不成的viewController。

+0

如果你不是絕對必須的,不要做同步代碼。 – 2011-12-31 23:38:58

+0

那麼我會如何調用請求? – Jetpackman 2012-01-01 00:29:11

+1

就像這樣,但我的意思是你應該簡單*允許*代碼異步執行。將與推文加載相關的代碼放在代碼塊中。 – 2012-01-01 00:31:18

回答

0

不要。基本上,重點是讓你的代碼異步。這對用戶來說會更好(用戶界面會更平滑),對開發人員來說更容易(是的,真的!)

做所有與加載塊中的推文相關的所有內容。把你的NSLog放在塊中,而不是放在它的外面。完成加載所有推文後,只需致電[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];或其他內容即可更新UI。

請務必避免在存儲tweets的屬性上使用nonatomic標誌。你想避免無效的跨線程訪問。

+0

只是想知道,你會在哪裏調用重載數據,我現在正在做應用代理中的所有東西 – Jetpackman 2012-01-01 01:16:47

+0

你應該真的在所有的代碼中使用視圖控制器。 App Delegate確實不應該這樣做 - 它負責處理應用程序本身(啓動,關閉,暫停,恢復等)。 – 2012-01-01 01:18:31

+0

performSelectorOnMainThread如何工作?我可以在視圖控制器上調用它,還是在視圖控制器內部執行它? – Jetpackman 2012-01-01 01:33:17