2017-01-19 2 views
0

私はここにこだわりました。私は画像をダウンロードするために作成するカスタムクラスを持っています。私がしたいのは、メソッドの1つの完了ブロックを作ることです。例えばのためにカスタムオブジェクトダウンロードマネージャー

CustomObj *obj = [[CustomObj alloc] init]; 
[obj downloadImage:url withCompletion:(BOOL *finished) { 

//do stuff 
}]; 

問題は、私は、画像をダウンロードするには、2 NSURLSessionsを使用して、これらの各ブロックであり、CustomObjです。基本的に最初のセッションが始まり、最初のセッションが完了すると2回目のセッションが実行され、2回目のセッションが完了すると、私はカスタム完了をしたい。これをどうやって行うのか分かりません。 Plsは助けてくれます。

+0

これで問題は何ですか? –

+0

別の補完が完了した後に起動されるカスタムクラスの補完方法。 – GeneCode

答えて

2

あなたが次にCustomobj.m

+(void)downloadImage:(NSString *) url 
      success:(void(^)(BOOL finished))success 
      failure:(void(^)(NSString *errorMessage))failure 

{ 
    if(success) 
    { 
    success(success); 
    } 
    else{ 
    failure(errorMessage); 
    } 
} 

ではこの

Customobj.h

+(void)downloadImage:(NSString *) url 
       success:(void(^)(BOOL finished))success 
       failure:(void(^)(NSString *errorMessage))failure; 

のように行うことができますあなたはそれが好きで使用することができます:

[Customobj downloadImage:url success:^(BOOL finished) { 

    } failure:^(NSString *errorMessage) { 

    }]; 
+0

成功したらエラーになります(YES)。 C99で暗黙の "成功"宣言が無効です – GeneCode

+0

これはうまくいくようです。エラーは私の悪かったです。私はすぐにこの答えを受け入れるでしょう。 – GeneCode

1

することができます絶対に他のブロック内のブロックをネストします。

ここでは、それがどのように機能するかを示す小さな例を示します。もちろん、ここでの方法はかなり空欄となっているが、それはあなたのアイデア持っているだけのようです:あなたは、メソッドbuttonPressを呼び出すたび

- (void) networkCallWithCompletionBlock:(void (^)(NSString *response))completed { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     completed(@"My amazing response"); 
    }); 
} 

- (void) methodWithCompletionBlock:(void (^)(BOOL success))completed { 
    [self networkCallWithCompletionBlock:^(NSString *response) { 
     completed([response isEqualToString:@"My amazing response"]); 
    }]; 
} 

- (void) buttonPress() { 
    [self methodWithCompletionBlock:^(BOOL success) { 
     NSLog(@"%@", @(success)); 
    }]; 
} 

を、それは2つの非同期メソッドの連鎖の引き金となり、そのメッセージは後に0.5秒に印刷されます。

+0

正当なものと思われます。私はこれを試してみましょう。 – GeneCode