0

からコードを抽出する必要があります

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                           [self doSomethingWithData:data];
                           outstandingRequests--;
                           if (outstandingRequests == 0) {
                               [self doSomethingElse];
                           }
                       }];

void AsynchronousRequestCompletionHandler (NSURLResponse *response, NSData *data, NSError *error)
{
  ...    
}

しかし、私はできません: ここに画像の説明を入力

xamarin iOSで私はそれをやった:代わりにこれ

TextLogin.ShouldChangeCharacters += () => { some code...};

これを作った:

TextLogin.ShouldChangeCharacters += LoginAndPassValidator;

// ... some code

bool LoginAndPassValidator (UITextField textField, NSRange range, string replacementString)
{
    BtnLogin.Enabled = (!String.IsNullOrWhiteSpace (TextLogin.Text)) && (!String.IsNullOrEmpty (TextPass.Text));
    if (BtnLogin.Enabled) {
        BtnLogin.SetTitleColor (UIColor.Black, UIControlState.Normal);
    } else {
        BtnLogin.SetTitleColor (UIColor.Gray, UIControlState.Normal);
    }
    return true;
}

obj Cでこの抽出を行うことはできますか?

4

2 に答える 2

0
[NSURLConnection sendAsynchronousRequest:request
                               queue:[NSOperationQueue mainQueue]
                   completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                       AsynchronousRequestCompletionHandler(response, data, error);
                   }];

編集:

C++ で便利なものを作成できます。

template <class T>
void SendAsyncRequest(NSURLRequest* request, NSOperationQueue* opQueue, T func)
{
        [NSURLConnection sendAsynchronousRequest:request
                               queue:opQueue
                   completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                       func(response, data, error);
                   }];
}

そして、これを呼び出すことができます (.m を .mm に名前変更することを忘れないでください):

SendAyncRequest(request, [NSOperationQueue mainQueue], AsynchronousRequestCompletionHandler);

それはあなたが必要とするものですか?

于 2013-11-04T14:50:49.473 に答える
0

パラメータはメソッドではなくブロックであることに注意してください。したがって、代わりにメソッド (または関数) を使用することはできません。

typedef void (^ResponseCompletionBlock) (NSURLResponse *, NSData *, NSError *);

ResponseCompletionBlock completionHandler = ^(NSURLResponse *response, NSData *data, NSError *error) {
    [self doSomethingWithData:data];
    outstandingRequests--;

    if (outstandingRequests == 0) {
        [self doSomethingElse];
    }
};

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:completionHandler];

メソッドで処理したい場合、最も簡単な解決策は

ResponseCompletionBlock completionHandler = ^(NSURLResponse *response, NSData *data, NSError *error) {
     [self asynchronousRequestCompletionHandlerForResponse:response 
                                                   withData:data
                                                   andError:error];
};

このコンテキストでプレーンな C 関数を使用することはお勧めしません。Obj-C で C# 言語パターン/命名規則を使用しないでください。

于 2013-12-06T11:36:10.577 に答える