2014-09-27 29 views
0

我試圖從遠程文件中獲取一些數據。我在異步請求塊內創建了一個_items數組,它實際上已經是數據了,但是當我的控制器中的其他任何地方調用_items時仍然是空的。如何使用異步數據

我不知道,但我猜測,因爲數據加載異步,當調用_items仍然是空的。那麼如何在異步任務完成後如何將數組與數據結合使用呢?

- (IBAction)fetchEvent 
{ 

    _items = [[NSMutableArray alloc] initWithCapacity:5]; 
    NSString *link = [NSString stringWithFormat:@"url...?id=%@", self.eId]; 
    NSURL *url = [NSURL URLWithString:link]; 
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, 
              NSData *data, NSError *connectionError) 
    { 
     if (data.length > 0 && connectionError == nil) 
     { 
      NSDictionary *match = [NSJSONSerialization JSONObjectWithData:data 
                   options:0 
                   error:NULL]; 
      NSArray *odds = [match objectForKey:@"odds"]; 
      OddsItem *item; 

      for (NSDictionary *books in odds) { 
       item = [[OddsItem alloc] init]; 
       item.oddsBook = [odds objectForKey:@"book"]; 
       [_items addObject:item];     
      } 
     } 
    }]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self fetchEvent]; 
} 
+0

一種可能是有你完成塊張貼通知的數據加載完成和視圖控制器做任何你需要用'_items'進行反應,該通知時。您也可以將一個塊傳遞給它可以在完成處理程序結束時執行的'fetchEvent'。 – 2014-09-27 16:16:24

回答

0

可變數據在多線程情況下是危險的。 NSArray更好。

@property (nonatomic, copy) NSArray *items; 

塊可以捕獲外部變量,但不能直接修改它。在完成塊試試這個

if (data.length > 0 && connectionError == nil) 
    { 
     NSDictionary *match = [NSJSONSerialization JSONObjectWithData:data 
                  options:0 
                  error:NULL]; 
     NSArray *odds = [match objectForKey:@"odds"]; 
     NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:5]; 
     for (NSDictionary *books in odds) { 
      OddsItem *item = [[OddsItem alloc] init]; 
      item.oddsBook = [odds objectForKey:@"book"]; 
      [items addObject:item];     
     } 
     self.items = items; 
    } 
+0

我用'__block',但我得到了幾個警告和一個錯誤...'類型說明符丟失,默認爲'int''不兼容指針整數轉換初始化'int'與一個'NSMutableArray *'類型的表達式'等等。 – mynameis 2014-09-27 16:57:41

+0

@ user3279339確定我不知道_items是什麼類型。 '__block NSMutableArray * items = [[NSMutableArray alloc] initWithCapacity:5];'在塊'[items addObject:item]'應該工作 – dopcn 2014-09-27 17:02:40

+0

'NSMutableArray * _items;' – mynameis 2014-09-27 17:03:36