1

我有一个视图,其中显示了一个 UIImageView,它是免费的互联网,我用来带来正确加载的数据 NSXMLparser,问题是我用来使解析器 NSOperationQueue 成为背景,所以我在主视图中刷新图像。不以任何方式刷新它们的图像

我把下面的代码留在这里

- (void)viewDidLoad
{
    [Base64 initialize];

    [super viewDidLoad];

    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                            selector:@selector(loadDataWithOperation)
                                                                              object:nil];
    [queue addOperation:operation];
    [operation release];
}

- (void) loadDataWithOperation {
    getData=NO;
    NSURL *url1 =  [ NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSData *xmlData = [NSData dataWithContentsOfURL:url1];
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:xmlData];
    [parser setDelegate:self];
    [parser parse];

    [self performSelectorOnMainThread:@selector(showImage)withObject:nil waitUntilDone:NO];
}

-(void)showImage
{
    NSArray *imagen =[[NSArray alloc] initWithArray:xml];
    NSString *hola1 =[[imagen objectAtIndex:5]objectForKey:@"imagen"];
    NSData * dataa = [Base64 decode:hola1];
    img = [UIImage imageWithData:dataa];
    self.images.image = img;
    [images setImage:img];
    [img release];
}

我究竟做错了什么?感谢您的帮助

4

1 回答 1

0

我没有看到任何明显的东西(尽管显然我们没有看到xml数组的构建,也没有确切地知道 XML 本身的样子)。您应该NSLog(或设置断点并手动检查)xml以及hola1dataa结果showImage,以准确识别每个步骤发生的情况。

后台操作和下载 XML 有两个可能的问题。这些似乎都不适用这里,但我会提到它以防万一:

  1. 但是没有什么可以阻止您在此处演示的 XML 的下载和解析。如果您NSURLConnection用于下载 XML(可能出于演示的目的在此处对其进行了简化),则NSURLConnection在后台队列中使用会出现问题。但是,如果您使用dataWithContentsOfURL(或更好的NSXMLParser方法initWithContentsOfURL),那将不是问题。

  2. 看起来您正在下载单个 XML,但如果您同时下载多个 XML 源,您应该意识到许多服务器对它们允许来自单个客户端的并发连接数施加了限制。您可以使用NSOperationQueue属性maxConcurrentOperationCount来缓解该问题。四是典型值。


不相关,但您可能需要查看一些较小的内存管理问题:

  • 如果您已经拥有xml,则无需创建新的imagen

  • 您可能应该在添加之后release的对象,或者如果您需要保留它以重用它,您应该将其设为类属性或实例变量;queueoperation

  • 如果你这样做,你可以完全摆脱operation

    [queue addOperationWithBlock:^{
        [self loadDataWithOperation];
    }];
    
  • 完成后,您应该release使用该parser对象;

  • 如果你保留imagen你的代码,你应该release在完成时也这样做;和

  • 你不应该对象releaseimg因为imageWithData返回一个autorelease对象

如果您进行静态分析(从“产品”菜单中选择“分析”),可能会向您指出常规内存管理的内容。

最后的观察:

  • 我注意到你有:

    NSData *xmlData = [NSData dataWithContentsOfURL:url1];
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:xmlData];
    

    显然这xmlData没有必要,因为您也可以这样做:

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url1];
    
于 2013-02-08T17:37:15.227 回答