1

現在、3つの異なるURLを直線でダウンロードするプログラムがあり、Webページを非同期でダウンロードできるように変更したいのですが、プログラムが進行する前に3つすべてのWebページのダウンロードを完了させたいです。オンラインでチュートリアルを見たことがありますが、NSOperationとNSoperationqueueを機能させることができませんでした。

これは私が作成したNSOperationクラスです

#import <Foundation/Foundation.h>

@interface LoadPage : NSOperation

@property (nonatomic, copy) NSURL *URL;
@property (nonatomic, copy) NSData *webpage;

- (id)initWithURL:(NSURL*)url;
- (void)main;

@end

それは単にウェブページをダウンロードするように設計されています

#import "LoadPage.h"
//Loadpage.m
@implementation LoadPage
@synthesize URL;
@synthesize webpage;

- (id)initWithURL:(NSURL*)url{
    [self setURL:url];
    return self;
}
//Download Webpage function
- (void)main {
    NSData *page = [NSData dataWithContentsOfURL:URL];
    [self setWebpage:page];
}

3つの別々のWebページをダウンロードして、それら3つのWebページすべてを同時に完了させ、すべて完了したら、プログラムの残りの部分の実行に移りたいと思います。

@interface MasterParser : NSObject{
    NSOperationQueue *queue;
}

-(NSMutableArray *)loadPlayer:(NSString *)name;

@end

@implementation MasterParser
    -(NSMutableArray *)parsePage:(NSString *)name{
        NSURL *google = [NSURL URLWithString:@"http://www.Google.com"];
        NSURL *yahoo = [NSURL URLWithString:@"http://www.yahoo.com"];
        NSURL *mlbtraderumors = [NSURL URLWithString:@"http://www.mlbtraderumors.com"];

        LoadPage *gpage = [[LoadPage alloc] initWithURL:google];
        LoadPage *ypage = [[LoadPage alloc] initWithURL:yahoo];
        LoadPage *mpage = [[LoadPage alloc] initWithURL:mlbtraderumors];

        queue = [[NSOperationQueue alloc] init];
        [queue addOperation:gpage]; 
        [queue addOperation:ypage];
        [queue addOperation:mpage];

        [queue waitUnitilAllOperationsAreFinished];

        NSData *webpage = [gpage webpage];
    //...etc do all the operations and parsing with the webpages after all the downloads are done
}

これを実行すると、プログラムがフリーズし、不正な実行エラーが発生します。私の疑いは、loadpage.mの最後に行を使用する必要があるということです。

    [MasterParser performSelectorOnMainThread:@selector(parsePage:)
                                       withObject:nil
                                    waitUntilDone:YES];

どんな助けでもありがたいです!

4

2 に答える 2

1

解析自体は、Webページのダウンロードと比較してそれほど問題にはならないため、メインスレッドで実行した場合、それほど遅れが生じることはありませんが、必要に応じて、別のスレッドでWebページを解析できます。もう1つ指摘したいのは、を呼び出す場合は、メインスレッド[MasterParser performSelectorOnMainThread:@selector(parsePage:) withObject:nil waitUntilDone:YES];を呼び出すということです。+[MasterParser parsePage:nil]代わりに、self(またはそのメソッドを呼び出すオブジェクト)である必要があります。[self performSelectorOnMainThread:@selector(parsePage:) withObject:nil waitUntilDone:YES];

于 2013-01-06T03:36:28.163 に答える
0

まず、この質問に答えてくれたすべての人に感謝します。キーは行を追加することでした

self=[super init];
to the initWithURL method after that everything started working.


#import "LoadPage.h"

@implementation LoadPage
@synthesize URL;
@synthesize webpage;


- (id)initWithURL:(NSURL*)url{
    self = [super init];
    [self setURL:url];
    return self;
}
- (void)main {
    NSData *page = [NSData dataWithContentsOfURL:URL];
    [self setWebpage:page];
}


@end

この質問への回答を手伝ってくれたすべての人に改めて感謝します。

于 2013-01-06T19:26:51.373 に答える