2

私は次のコードを持っています:

- (Transporter *) getTransporter:(NSNumber *)transporterId
{
    for(Transporter *transporter in transporters)
    {
         if([transporter.transporterId isEqualToNumber:transporterId])
         {
             return transporter;
         }
    }
    __block Transporter *transporter;

    [self requestTransporter:transporterId completion:^(NSObject *entity) {
        transporter = (Transporter* )entity;
     }];

    return transporter;
}

私の質問は次のとおりです: __block トランスポーターはどのように機能しますか? 変数が値を取得するまでiOSは待機しますか? それとも、nil 値を持っていて、後でオブジェクトを持っていますか?

戻り値を持つメソッドに対してブロックメソッドは機能しますか?

4

2 に答える 2

3

__block キーワードを使用すると、変数 (ここではトランスポーター) を変更 (読み書きアクセス) できます。メソッド requestTransporter が同期の場合、彼は実行され、呼び出しが終了する前に完了ブロックを実行します。次のパターンも使用できます。

- (void) getTransporter:(NSNumber *)transporterId withCompletionBlock:(void(^)(Transporter*))completionBlock
{
    if(!completionBlock)
      return; //Avoid crashs.

    for(Transporter *transporter in transporters)
    {
         if([transporter.transporterId isEqualToNumber:transporterId])
         {
             completionBlock(transporter);
             return;
         }
    }

    [self requestTransporter:transporterId completion:^(NSObject *entity) {
        completionBlock((Transporter* )entity);
     }];
}

そして、次のように使用します。

// transporterId is an NSNumber containing your transporter id.
[self getTransporter:transporterId withCompletionBlock:^(Transporter *transporter) {
    // Execute your code using transporter object here.
}];
于 2013-11-13T11:02:59.457 に答える
1

ブロックが非同期である限り、エンティティが割り当てられずにトランスポーターがすぐに返されます。

代わりに、次のように完了ハンドラーを使用します。

- (void) requestTransporter:(NSNumber *)transporterId withCompletionBlock:(void(^)(Transporter))completionBlock
{
  for(Transporter *transporter in transporters)
   {
     if([transporter.transporterId isEqualToNumber:transporterId])
     {
         completionBlock(transporter);
     }
   }
__block Transporter *transporter;

[self requestTransporter:transporterId completion:^(NSObject *entity) {
    transporter = (Transporter* )entity;
    completionBlock(transporter);
 }];

}
于 2013-11-13T08:36:30.153 に答える