0

「ComLog」という名前の「UIImage」戻り型メソッドがあります。このメソッドから画像を返したいです。「ComLog」メソッドでは、GCD を使用して配列から画像値を取得します。「NSLog(@"qqqqqqqqqqq %@", exiIco)" は 'image' 値を出力しますが、NSLog(@"qqqqqqqqqqq %@", exiIco);" は出力しません。詳細は次のとおりです。

-(UIImage*) ComLog
{
ExibitorInfo *currentExibitor100 = [[ExibitorInfo alloc] init];
currentExibitor100 = [self.exibitorsArray objectAtIndex:0];

imageQueueCompanyLogo = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(imageQueueCompanyLogo, ^
{
    UIImage *imageCompanyLogo = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentExibitor100 companyLogoURL]]]];
    dispatch_async(dispatch_get_main_queue(), ^
    {
        self.exibitorIcoImageView.image = imageCompanyLogo;
        exiIco = imageCompanyLogo;
        NSLog(@"qqqqqqqqqqq %@", exiIco);
    });
});
return exiIco;
}


- (void)viewDidLoad
{
   [super viewDidLoad];
   UIImage *a = [self ComLog];
   NSLog(@"It should be a image %@", a);
}

ここでは、すべてのプロパティがグローバルに宣言されています (「Myclass.h」ファイル内)。私はObjective Cの初心者です。答えがわかっている場合は返信してください。前もって感謝します。

4

2 に答える 2

2

あなたのコード スニペットには多くの誤りがあり、どこから始めればよいか判断するのが困難です。

今は GCD から離れて、後でもっと経験を積んだときに見てみることをお勧めします。

基本的に、リモート サーバーからイメージをロードします。これには、非常に単純なユースケースで十分な便利な方法がNSURLConnection用意されています。

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler;

ここでドキュメントを見つけることができます: NSURLConnection Class Reference

リモート リソースを読み込むための推奨される方法はNSURLConnection、デリゲートを実装する非同期モードで使用することです。詳細については、 URL Loading System Programming Guide - Using NSURL Connection を参照してください。

Conventionsも読むことをお勧めします。

sendAsynchronousRequest の使用方法の短い例を次に示します。

NSURL* url = [NSURL URLWithString:[currentExibitor100 companyLogoURL]];
NSMutableURLRequest* urlRequest = [NSURLRequest requestWithURL:url];     
NSOperationQueue* queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:urlRequest 
                                   queue:queue    
                       completionHandler:^(NSURLResponse* response, 
                                                  NSData* data, 
                                                 NSError* error)
{
    if (data) {        
        // check status code, and optionally MIME type
        if ( [(NSHTTPURLResponse*)(response) statusCode] == 200 /* OK */) {
            UIImage* image = [UIImage imageWithData:data];
            if (image) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    self.exibitorIcoImageView.image = image;
                });
            } else {
                NSError* err = [NSError errorWithDomain: ...];
                [self handleError:err];  // execute on main thread!
            }                
        }
        else {
             // status code indicates error, or didn't receive type of data requested
             NSError* err = [NSError errorWithDomain:...];
             [self handleError:err];  // execute on main thread!
        }                     
    }
    else {
        // request failed - error contains info about the failure
        [self handleError:error]; // execute on main thread!
    }        
}];
于 2013-08-20T07:27:00.103 に答える
0

まず、Objective C のdispatch_asyncブロックについて読むことをお勧めします。関数内で使用しているブロックは非同期であるため、独自のプールで実行されるため、使用後すぐに戻ります。適切に使用するために、別のメソッドを呼び出してブロック内の画像プロセスを返すか、NSNotification画像の準備ができたら投稿できます。このような:

-(void) ComLog
{
    ExibitorInfo *currentExibitor100 = [[ExibitorInfo alloc] init];
    currentExibitor100 = [self.exibitorsArray objectAtIndex:0];

    imageQueueCompanyLogo = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(imageQueueCompanyLogo, ^
    {
        UIImage *imageCompanyLogo = [UIImage imageWithData:[NSData dataWithContentsOfURL: [NSURL URLWithString:[currentExibitor100 companyLogoURL]]]];
        dispatch_async(dispatch_get_main_queue(), ^
                       {
                           self.exibitorIcoImageView.image = imageCompanyLogo;
                           exiIco = imageCompanyLogo;
                           NSLog(@"qqqqqqqqqqq %@", exiIco);
                           [self imageIsReady:exiIco];
                       });
    });
//    return exiIco;
}

- (void)imageIsReady:(uiimage *)image
{
    //do whatever you want with the image
    NSLog(@"Image is here %@", image);
}
于 2013-08-20T06:53:05.540 に答える