2013-03-22 34 views
0

我想獲得一個NSArray的參考,當我調用sendAsyncrhonousRequest時會通過。一旦我有了NSArray,我想將它分配給一個類屬性,但似乎我不能那樣做。分配來自匿名處理程序的數據ios

@implementation BarTableViewController { 
    NSArray *_jsonArray; 
} 

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
{ 

    NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; 

    if (statusCode == 200 && data.length > 0 && error == nil) 
    { 
     NSError *e = nil; 
     NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e]; 

     if (!jsonArray) { 
      NSLog(@"Error parsing JSON: %@", e); 
     } else { 
      _jsonArray = jsonArray; // this doesn't work? _jsonArray is at the class level 
     } 
    } 
    else if (error) 
    { 
     NSLog(@"HTTP Status: %ld", (long)statusCode); 
    } 
    else if (statusCode != 200) 
    { 
     NSLog(@"HTTP Status: %ld", (long)statusCode); 
    } 
}]; 

如果我遍歷jsonArray它將正確顯示數據。如果將其分配給_jsonArray以稍後使用它,則不再返回任何數據。該數組的數量爲零。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return _jsonArray.count; // always returns zero 
} 

如何將jsonArray分配給類屬性,以便日後可以使用該數據?

+0

顯示你的_jsonArray聲明是否聲明它很弱?你能顯示代碼來演示你如何嘗試讀取數組並找到它是空的嗎?它是空的還是零?另外,至少從我的經驗來看,你的詞彙有點獨特。他們通常被稱爲塊,而不是匿名處理程序;通常我們會調用一個實例變量而不是類級別,以及屬性和屬性。只是一個友好的提示。 – 2013-03-22 07:21:09

+0

我是新來的客觀的C/IOS,所以我的行話是關閉的,對此感到遺憾。我已經更新了這個問題,並提供了您要求的內容。當numberOfRowsInSection被調用時,計數總是爲零。 – user1218776 2013-03-22 07:25:47

+0

沒問題:)你確定它是相同的實例,它設置它與讀取它? – 2013-03-22 07:27:13

回答

1

我的理論是正確的。 UI在請求完成之前加載。我所做的修復此問題的方法是致電

[self.tableView reloadData]; 

在異步請求中。

0

忘記簡單的賦值:

@implementation BarTableViewController { 
    // NSArray *_jsonArray; forget it 
} 

,而不是自己的對象。

@interface BarTableViewController() 
@property(nonatomic, strong)NSArray *jsonArray; 
@end 

/* --------- */ 

@implementation BarTableViewController 
@syntethise jsonArray = _jsonArray; 
@end 

然後讓它擁有它

self.jsonArray = jsonArray; // will call synthesized setter 

我假設你正在使用ARC,因爲你得到一個零值,而不是一個懸擺指針。現在你將得到一個有效的jsonArray。

+0

感謝您的提示,我的代碼現在看起來更清潔。但它不能解決問題。我認爲問題在於在異步請求完成之前呈現UI。如果我用靜態數據替換那個調用,它可以正常工作。我試圖找出如何首先重新填充表視圖控制器。 – user1218776 2013-03-23 04:01:32