現在、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];
どんな助けでもありがたいです!