当我从另一个类(xcode)调用NSArray时它是空的

时间:2011-08-09 06:10:18

标签: objective-c xcode nsarray

我是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];    
}

任何帮助将不胜感激,谢谢你们! 问候。

2 个答案:

答案 0 :(得分:2)

...你明白异步意味着什么吗?这意味着您的函数将返回并且连接将继续,并在准备就绪时进行回调。你编码的方式,你开始连接,然后立即尝试使用数据 - 它还没有!在尝试使用数组之前,您需要等到connectionDidFinishLoading之后。

进一步研究异步意味着什么;看来你似乎并不理解。

修改

让我澄清一下,因为你似乎错过了我的观点。您的viewDidLoad函数在调用connectionDidFinishLoading回调之前很久就会完成,因此当然还没有newsStories数组。当你打电话:

[news parseXMLFileAtUrl:latestUrl];

在loadData函数中,不停止并等待连接返回;如果它是同步的,它会,但异步不会。 (因此我请你研究异步实际意味着什么,显然你还没有做过)。由于该调用返回,然后您立即尝试使用加载的数据(在调用connectionDidFinishLoading之前很久),您自然没有任何数据。

答案 1 :(得分:0)

来自Apple的文档:

  

可变对象通常不是线程安全的。使用可变对象   在线程应用程序中,应用程序必须同步访问   他们用锁。 (有关更多信息,请参阅“原子操作”)。在   一般来说,集合类(例如,NSMutableArray,   NSMutableDictionary)在涉及突变时不是线程安全的。   也就是说,如果一个或多个线程正在更改同一个阵列,则会出现问题   可以发生。您必须锁定发生读写的位置   确保线程安全。

Reading this可能会帮助你。不完全确定你的应用程序是否正在发生这种情况,但它似乎是一个好的起点。