3

彼女を呼び出したviewcontrollerにjSONを返す必要があるPOSTメソッドを書きました。成功ブロックreturn _jsonDictionary;を追加すると、次のエラーが発生します。

Incompatible block pointer types sending 'id (^)(NSURLRequest *__strong, NSHTTPURLResponse *__strong, __strong id)' to parameter of type 'void (^)(NSURLRequest *__strong, NSHTTPURLResponse *__strong, __strong id)'

非同期であるため、リターンを追加すると強制的に同期されると思いますが、アプリのすべての POST メソッドを 1 つのクラスにしたいので、何かを使用してアプリ全体で宣言されている変数に JSON からデータを取得します私valueForKeyにとって物事を少し複雑にします。それってデザインが悪いの?

    -(NSDictionary *)getData
    {   
        _jsonDictionary = [[NSDictionary alloc]init];
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/getSomething",MainURL ]];

        [AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

        AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:nil parameters:nil];    

        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
        {
            _jsonDictionary = JSON;

            NSLog(@"jsonDictionary: %@",_jsonDictionary);
        }
        failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON)
        {
            NSLog(@"request: %@",request);
            NSLog(@"Failed: %@",[error localizedDescription]);
        }];

        [httpClient enqueueHTTPRequestOperation:operation];
}

別の質問ですが、上記のコードの最後にこの警告が表示されるのはなぜですか? Control reaches end of non-void function.m と .h のメソッドの名前を-(void )getData??に変更しても、

4

3 に答える 3

1

あなたの主な関心事がデータを「取り戻す」ことである場合、次の 3 つの方法があります (それ以上の可能性もありますが、私ができるのはこれら 3 つのことだけです)。

  1. getDataメソッドで、NSNotification呼び出す前にviewControllerがサブスクライブしたaを投稿できますgetData
  2. dataManager をシングルトンとして使用している (または使用する予定がある) 場合、viewController は dataManager の @property で KVO できます。
  3. 私のお気に入り: 呼び出し元の viewController で、呼び出さgetDataれるメソッドにブロックを作成して渡します (結果の有無にかかわらず)。これはまさにAFJSONRequestOperation、例で を構築するときに行っていることです。
于 2013-07-07T07:56:21.470 に答える
0

ayn と sync を完全に混在させています... getData が返すことができる有効な _jsonDictionary はありません。_jsonDictionary は、完了ブロックが呼び出されたときに非同期でのみ入力されます。

そこから先に進む必要があります....たとえば、別のメソッドを呼び出します


あなたが見るエラー/警告については... getDataは何か(NSDictionary *)またはvoid *(ほとんどIDに等しい)を返すはずです

ものを返さないために、それは無効です。

于 2013-07-07T08:36:38.233 に答える
0

あなたが得ているエラーは正しいです。ブロックは何も返さないはずですが、あなたreturn _jsonDictionary;はそれを試みています。

あなたがする必要があるのは_jsonDictionary、(すでに行っているように)成功ブロック内で更新し、別の関数を呼び出して、UI を更新するイベントを起動することです(呼び出しなど[self.tableView refreshData])。

于 2013-07-07T07:37:53.583 に答える