2016-04-25 6 views
-1

大きな問題が発生しました。 は、ここに私のコードディスパッチブロックが完全に実行されず、他のコードが実行されています

#import "NewsAppMenuVC.h" 
#import "MenuController.h" 
#import "NewsAppTebleCell.h" 
#import "NewsAppNewsVC.h" 
#import "AFHTTPRequestOperationManager.h" 
#import "MBProgressHUD.h" 

@interface NewsAppMenuVC() 
{ 
    MBProgressHUD *HUD; 
    News *news; 
    NSString *title; 
    NSString *abstract; 
    NSString *url; 
    NSString *byLine; 
    NSString *publishedDate; 
    NSDictionary *jsonDictionary; 
    NSMutableArray *dataArray; 
} 
@property (nonatomic, strong) MenuController *menuController; 
@end 


@implementation NewsAppMenuVC 

-(void) viewWillAppear:(BOOL)animated 
{ 
self.menuController = [[MenuController alloc]init]; 
dataArray = [[NSMutableArray alloc]init]; 

} 

- (void)viewDidLoad { 
[super viewDidLoad]; 


self.tableView.delegate = self; 
dataArray = [[NSMutableArray alloc]init]; 

// Do any additional setup after loading the view. 
} 



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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
NewsAppTebleCell *cell = [tableView dequeueReusableCellWithIdentifier:@"newsCell" forIndexPath:indexPath]; 
news = [self.menuController newsAtIndex:indexPath.row]; 
cell.newsNameLabel.text = news.newsName; 
// Configure the cell... 

return cell; 

} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
//[HUD showAnimated:YES]; 
//NSDictionary *resultDictionary = [[NSDictionary alloc]init]; 
news = [[News alloc]init]; 
news = [self.menuController newsAtIndex:indexPath.row]; 

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self getRequiredData:news.newsName]; 
}); 



UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
NewsAppNewsVC *destVC = [myStoryBoard instantiateViewControllerWithIdentifier:@"NewsAppNewsVC"]; 
if([dataArray count] == 0) 
{ 
    NSLog(@"Array is empty"); 
} 
else{ 

    destVC.dataArray = dataArray; 
    [self.navigationController pushViewController:destVC animated:YES]; 
} 

} 

-(void) getRequiredData:(NSString*)name 
{ 
[HUD showAnimated:YES]; 
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/xml", @"text/json" , nil]; 
NSLog(@"In getRequiredData method"); 

[manager GET:@"http://api.nytimes.com/svc/news/v3/content/all/U.S./.json?limit=5&api-key=e024ff0a3fba0e538ed8625bd74cf241%3A7%3A75053716" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
{ 
    NSLog(@"Within the API manager"); 
    jsonDictionary = [[NSDictionary alloc]init]; 
    jsonDictionary = (NSDictionary *) responseObject; 
    //NSDictionary *resultDictionary = [NSDictionary dictionaryWithDictionary:jsonDictionary]; 
} 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) 
{ 
    NSLog(@"Failed %@", error); 
}]; 

NSLog(@"Filtering results"); 
NSArray *resultsArray = jsonDictionary[@"results"]; 
//NSLog(@"Array = %@", resultsArray); 
for(int i = 0; i < [resultsArray count]; i++) 
{ 
    NSDictionary *resultDictionary = [resultsArray objectAtIndex:i]; 
    title = [resultDictionary objectForKey:@"title"]; 
    abstract = [resultDictionary objectForKey:@"abstract"]; 
    url = [resultDictionary objectForKey:@"url"]; 
    byLine = [resultDictionary objectForKey:@"byline"]; 
    publishedDate = [resultDictionary objectForKey:@"published_date"]; 
    NSString *imageUrl = @"No Image"; 
    if([[resultDictionary objectForKey:@"multimedia"] isKindOfClass:[NSArray class]]) 
    { 
     NSArray *multimediaArray = [resultDictionary objectForKey:@"multimedia"]; 
     if([multimediaArray count] < 3) 
     { 
      NSDictionary *multimedia3 = [multimediaArray objectAtIndex:0]; 
      imageUrl = [multimedia3 objectForKey:@"url"]; 
     }else 
     { 
      NSDictionary *multimedia3 = [multimediaArray objectAtIndex:3]; 
      imageUrl = [multimedia3 objectForKey:@"url"]; 
     } 
    }else{ 
     NSLog(@"No multimedia"); 
    } 


    News *newsObject = [[News alloc]initWithNewsName:news.newsName title:title abstract:abstract url:url byLine:byLine publishedDate:publishedDate imageUrl:imageUrl]; 


    NSLog(@"Title = %@", newsObject.title); 
    NSLog(@"Abstract = %@", newsObject.abstract); 
    NSLog(@"url = %@", newsObject.url); 
    NSLog(@"byLine = %@", newsObject.byLine); 
    NSLog(@"pub_date = %@", newsObject.publishedDate); 
    NSLog(@"Image url = %@", newsObject.imageUrl); 

    NSLog(@"Created an Object"); 


    [dataArray addObject:newsObject]; 
    NSLog(@"Object added successfully"); 
} 

} 

私はニュースのAPIからデータを取得しています。必要なことは、ディスパッチ・ブロックがAPIからデータをフェッチし、残りのコードのみが機能することです。 私の場合、ディスパッチブロックが実行されている間、ブロック外の他のコードも実行され、結果が不器用になります。誰もが私を助けることができれば、私は喜んでいるだろう .....

+0

を助ける 完了ハンドラで上記とこのすべてのコードを入れ

希望は、ユーザがテーブル内の特定の行に派遣ブロックの実行をクリックすると、APIからデータをフェッチするたびにということです。 –

+0

「残りのコード」とはどういう意味ですか? "結果をフィルタリング"した後のコード?そうであれば、このコードが完了ハンドラブロックまたは完了ブロックから呼び出された関数にあることが必要です – Paulw11

+0

残りのコードでは、ディスパッチブロック@ Paulw11の後のコードを意味します –

答えて

0

あなたが外でそれを書く必要があり

NSLog(@"Filtering results"); 
NSArray *resultsArray = jsonDictionary[@"results"]; 
//NSLog(@"Array = %@", resultsArray); 
for(int i = 0; i < [resultsArray count]; i++) 
{ 
NSDictionary *resultDictionary = [resultsArray objectAtIndex:i]; 
title = [resultDictionary objectForKey:@"title"]; 
abstract = [resultDictionary objectForKey:@"abstract"]; 
url = [resultDictionary objectForKey:@"url"]; 
byLine = [resultDictionary objectForKey:@"byline"]; 
publishedDate = [resultDictionary objectForKey:@"published_date"]; 
NSString *imageUrl = @"No Image"; 
if([[resultDictionary objectForKey:@"multimedia"] isKindOfClass:[NSArray class]]) 
{ 
    NSArray *multimediaArray = [resultDictionary objectForKey:@"multimedia"]; 
    if([multimediaArray count] < 3) 
    { 
     NSDictionary *multimedia3 = [multimediaArray objectAtIndex:0]; 
     imageUrl = [multimedia3 objectForKey:@"url"]; 
    }else 
    { 
     NSDictionary *multimedia3 = [multimediaArray objectAtIndex:3]; 
     imageUrl = [multimedia3 objectForKey:@"url"]; 
    } 
}else{ 
    NSLog(@"No multimedia"); 
} 


News *newsObject = [[News alloc]initWithNewsName:news.newsName title:title abstract:abstract url:url byLine:byLine publishedDate:publishedDate imageUrl:imageUrl]; 


NSLog(@"Title = %@", newsObject.title); 
NSLog(@"Abstract = %@", newsObject.abstract); 
NSLog(@"url = %@", newsObject.url); 
NSLog(@"byLine = %@", newsObject.byLine); 
NSLog(@"pub_date = %@", newsObject.publishedDate); 
NSLog(@"Image url = %@", newsObject.imageUrl); 

NSLog(@"Created an Object"); 


[dataArray addObject:newsObject]; 
NSLog(@"Object added successfully"); 
} 

は、このコードは完了ハンドラにする必要があり、代わりにアウト側の completion handler of GET method callであなたの次のコードを入れて。

更新:

UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
NewsAppNewsVC *destVC = [myStoryBoard instantiateViewControllerWithIdentifier:@"NewsAppNewsVC"]; 
if([dataArray count] == 0) 
{ 
NSLog(@"Array is empty"); 
} 
else{ 

destVC.dataArray = dataArray; 
[self.navigationController pushViewController:destVC animated:YES]; 
} 

このコードはずも完了ハンドラインチ 試してみてください。これは、このコードは何:)

+0

完了ハンドラが@Lion ????? –

+0

はい、そうだと思います。やってみなよ。 – Lion

+0

Nope。完了ハンドラはうまくいきませんでした。それでもコード実行が混乱する –

関連する問題