0

私のアプリでは、AFNetwork を使用してサービスを呼び出しています。AFNetworkを使用するのはこれが初めてです。いくつかのチュートリアルを見てコードを実行しようとすると、いくつかのエラーが発生します。

Incompatible block Types sending `void(^)(NSUrlRequest* _strong)…`

私のコードは

  NSString *weatherUrl = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString];
  NSURL *url = [NSURL URLWithString:weatherUrl];
  NSURLRequest *request = [NSURLRequest requestWithURL:url];

  // 2
  AFJSONRequestOperation *operation =
  [AFJSONRequestOperation JSONRequestOperationWithRequest:request
  // 3
      success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
          self.weather  = (NSDictionary *)JSON;
          self.title = @"JSON Retrieved";
          [self.tableView reloadData];
      }
  // 4
      failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
          UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
                                                       message:[NSString stringWithFormat:@"%@",error]
                                                      delegate:nil
                                             cancelButtonTitle:@"OK" otherButtonTitles:nil];
          [av show];
      }];

  // 5
  [operation start];
4

1 に答える 1

0

互換性のないブロック ポインター タイプが --- to ---- に送信されるなどのエラー メッセージの to... 部分があると思います。残りのメッセージはありますか?

おすすめ

ブロックに関するApple の短い実用的なガイドを確認できます。通常、互換性のない...型エラーは、変数 (この場合はブロック) が不適切に形成されていることを意味します。この問題を解決する最善の方法は、さまざまなシナリオでブロックを使用し、問題が発生している場所を正確に把握できるようにすることです。あなたが提供したコード フラグメントは、質問に直接答えるのに十分な情報を示していません。コールバックを行うときにブロックを使用する方法の簡単な例を次に示します。

Class A.h

typedef void (^CallbackBlock)();

@interface Class A : <NSObject>
@property (strong, nonatomic) CallbackBlock onSomethingHappened;
...
@end


ClassA.m

@implementation ClassA

-(void) someMethod
{
    ... (after some work done)
    self.onSomethingHappened(); //this will notify any observers 
}
...
@end

ClassB.h

#import "ClassA.h"

@interface ClassB:UIViewController
@property (strong, nonatomic)ClassA * referenceToClassA;
@end

ClassB.m

@implementation ClassB

//! Can also be some other method in the lifecycle
- (void)viewDidLoad
{
    __weak ClassB *weakSelf = self;
    self.referenceToClassA.onSomethingHappened = ^(){ [weakSelf SomeMethodWithWorkTodoAfterSomethingHappened]; };

}
...
- (void)SomeMethodWithWorkTodoAfterSomethingHappened
{
    ...do some work after receiving callback from ClassA
}

@end

サンプル

ブロックを使用した型キャストについて説明している次のブログ投稿を確認できます。あなたのエラーは、ブロックの型キャストの問題について不平を言っているようです。解決できない場合は、より完全なエラー メッセージを投稿してください。もう一度確認します。問題を考え抜く必要があったため、サンプルを含めました。

于 2013-12-02T12:40:58.493 に答える