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(またはブレークポイントを設定して手動で検査する必要があります) 。xmlhola1dataashowImage

バックグラウンド操作と XML のダウンロードには、2 つの問題が考えられます。これらはどちらもここでは当てはまらないようですが、念のため言及します。

  1. ただし、ここで示したように、XML のダウンロードと解析を妨げるものは何もありません。XML をダウンロードするために を使用していた場合NSURLConnection(おそらく、ここではデモンストレーションのために簡略化しています)、NSURLConnectionバックグラウンド キューでの使用には問題があります。しかし、あなたがdataWithContentsOfURL(またはより良いNSXMLParser方法でinitWithContentsOfURL)使用すれば、それは問題にはなりません。

  2. 1 つの XML をダウンロードしているように見えますが、複数の XML ソースを同時にダウンロードしている場合は、多くのサーバーが 1 つのクライアントから許可する同時接続数に制限を課していることを理解する必要があります。NSOperationQueueプロパティを使用maxConcurrentOperationCountして、その問題を軽減できます。4 は典型的な値です。


関係ありませんが、確認したい小さなメモリ管理事項がいくつかあります。

  • 既に持っている場合は、新しい;xmlを作成する必要はありません。imagen

  • を追加した後におそらくオブジェクトにするrelease必要があります。または、再利用するために保持する必要がある場合は、クラス プロパティまたはインスタンス変数にする必要があります。queueoperation

  • operationあなたがした場合、あなたは完全に取り除くことができます:

    [queue addOperationWithBlock:^{
        [self loadDataWithOperation];
    }];
    
  • 使い終わったらreleaseparserオブジェクトを使用する必要があります。

  • imagenコードを保持する場合はrelease、完了時にも保持する必要があります。と

  • オブジェクトを返すのでreleaseimgオブジェクトを使用しないでくださいimageWithDataautorelease

静的分析を行った場合 ([製品] メニューから [分析] を選択) すると、通常のメモリ管理に関する問題がおそらく指摘されるでしょう。

最後の観察:

  • 私はあなたが持っていることに気づきました:

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

    明らかに、それxmlDataは必要ではありません。

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