我是Objective-c的新手,当我从其他班级打电话给NSArray时,我遇到了问题。我有一个类来处理XML feed的解析,另一个类来管理UItableview的东西。这很奇怪,因为当它同步完成时(使用NSXMLParser方法),所有数据都显示在表中,但是当我使用NSURLConnection使其异步时,它会解析所有数据,但是当调用它时数组是空的。如果我调用NSLog,它会在解析数据时显示包含newsStories数组的所有数据,但在我调用它时会以某种方式将其删除。
在我拥有的解析器类和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];
}
任何帮助将不胜感激,谢谢你们! 问候。
答案 0 :(得分:2)
...你明白异步意味着什么吗?这意味着您的函数将返回并且连接将继续,并在准备就绪时进行回调。你编码的方式,你开始连接,然后立即尝试使用数据 - 它还没有!在尝试使用数组之前,您需要等到connectionDidFinishLoading之后。
进一步研究异步意味着什么;看来你似乎并不理解。
修改强>
让我澄清一下,因为你似乎错过了我的观点。您的viewDidLoad函数在调用connectionDidFinishLoading回调之前很久就会完成,因此当然还没有newsStories数组。当你打电话:
[news parseXMLFileAtUrl:latestUrl];
在loadData函数中,不停止并等待连接返回;如果它是同步的,它会,但异步不会。 (因此我请你研究异步实际意味着什么,显然你还没有做过)。由于该调用返回,然后您立即尝试使用加载的数据(在调用connectionDidFinishLoading之前很久),您自然没有任何数据。
答案 1 :(得分:0)
来自Apple的文档:
可变对象通常不是线程安全的。使用可变对象 在线程应用程序中,应用程序必须同步访问 他们用锁。 (有关更多信息,请参阅“原子操作”)。在 一般来说,集合类(例如,NSMutableArray, NSMutableDictionary)在涉及突变时不是线程安全的。 也就是说,如果一个或多个线程正在更改同一个阵列,则会出现问题 可以发生。您必须锁定发生读写的位置 确保线程安全。
Reading this可能会帮助你。不完全确定你的应用程序是否正在发生这种情况,但它似乎是一个好的起点。