2011-08-09 70 views
0

我是一個Objective-C中的新手,當我從其他類調用NSArray時遇到問題。我有一個類來處理XML提要的解析,另一個來管理UItableview的東西。這很奇怪,因爲當它同步完成(使用NSXMLParser方法)時,所有數據都顯示在表中,但是當我使用NSURLConnection使其異步時,它解析所有數據,但調用它時數組爲空。如果我調用NSLog,它會在解析數據時顯示包含newsStories數組的所有數據,但當我調用它時會以某種方式刪除它。當我從另一個類調用它時NSArray是空的(xcode)

在分析器類我有和的NSXMLParser的所有方法:

- (void)parseXMLFileAtUrl:(NSString *)URL { 
    data = [[NSMutableData alloc] init]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 
    if (connection) { 
     data = [[NSMutableData alloc]init]; 
    } 
    [connection release]; 
} 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    //Reset the data as this could be fired if a redirect or other response occurs 
    [data setLength:0]; 
} 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)_data 
{ 
    //Append the received data each time this is called 
    [data appendData:_data]; 
} 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    //Start the XML parser with the delegate pointing at the current object 
    _parser = [[NSXMLParser alloc] initWithData:data]; 
    newsStories = [[NSMutableArray alloc] init]; 
    [_parser setDelegate:self]; 
    [_parser setShouldProcessNamespaces:NO]; 
    [_parser setShouldReportNamespacePrefixes:NO]; 
    [_parser setShouldResolveExternalEntities:NO]; 
    [_parser parse]; 
} 

這是我如何調用數組:

-(BOOL) loadData{ 
    NSString *latestUrl = [[NSString alloc] initWithString:feed]; 
    if ([latestArray count] == 0) { 
     news = [[news_parser alloc]init]; 
     [news parseXMLFileAtUrl:latestUrl]; 
     [self setArray:news.newsStories];--- here it says null for Array and for newsItems 
    } 
    [latestUrl release]; 
    return YES; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    array = [[NSMutableArray alloc]init]; 
    _News.rowHeight =85; 
    [self loadData]; 
    [self._News reloadData];  
} 

任何幫助,將不勝感激,謝謝你們! 此致敬禮。

回答

2

...你明白異步是什麼意思嗎?這意味着你的函數將返回並且連接將繼續,並在準備就緒時進行回調。你有這種編碼的方式,你開始連接,然後立即嘗試使用數據 - 它還沒有!在嘗試使用數組之前,您需要等待connectionDidFinishLoading之後。

做一些更多的研究,究竟是什麼意思是異步的;看起來你並不理解這一點。

編輯

讓我澄清一下,因爲你似乎已經錯過了我的觀點。你的viewDidLoad函數在connectionDidFinishLoading回調被調用之前就已經完成了,當然newsStories數組還沒有。當你撥打:

[news parseXMLFileAtUrl:latestUrl]; 

在loadData函數中,表示不停止並等待連接返回;如果它是同步的,它會,但異步不會。 (因此,我要求你研究異步實際意味着什麼,顯然你還沒有完成)。由於該調用返回,然後您立即嘗試使用已加載的數據(在調用connectionDidFinishLoading之前很久),那麼您自然就沒有任何數據。

+0

嗨!我已完成connectionDidFinishLoading方法: - (void)connectionDidFinishLoading :(NSURLConnection *)connection { _parser = [[NSXMLParser alloc] initWithData:data]; newsItems = [[NSMutableArray alloc] init]; [_parser setDelegate:self]; [_parser setShouldProcessNamespaces:NO]; [_parser setShouldReportNamespacePrefixes:NO]; [_parser setShouldResolveExternalEntities:NO]; [_parser parse]; } 數組保存數據,但是當我調用它來填充它的時候,如果它看起來非常基本,但是感謝您的幫助 – marsalal1014

+0

請將來不要嘗試在代碼中粘貼代碼;我第一次看到你的帖子,我不需要在這裏重複。假設我不知道我在說什麼,請閱讀我的答案並實際嘗試我的建議。 – taxilian

+0

嗨Taxilian,抱歉在那裏複製代碼,我以爲我沒有清楚地解釋我的自我。在我回答你的第一個問題之後,我做了一些研究,並且明白了你的意思,並且在幾次調試之後,我得到了它。感謝您的觀點和解釋。對不起,如果我的評論是不敬的。謝謝! – marsalal1014

0

從蘋果的文檔:

可變對象通常不是線程安全的。要在線程應用程序中使用可變對象 ,應用程序必須使用鎖定來同步對它們的訪問 。 (有關更多信息,請參見「原子操作」)。通常,在涉及突變時,集合類(例如,NSMutableArray, NSMutableDictionary)在線程安全方面不是線程安全的。 也就是說,如果一個或多個線程正在更改相同的陣列,則會發生問題 。您必須在發生讀取和寫入的位置鎖定 以確保線程安全。

Reading this可能會幫助你。不完全確定這是否是您的應用中正在發生的事情,但它看起來像是一個開始的好地方。

相關問題