不兼容的块指针类型 - iOS

时间:2015-11-04 10:12:58

标签: ios objective-c return nsarray nsurlconnection

我有一个iOS应用程序,其功能负责发出异步网络请求。请求本身工作正常,但我遇到的问题是函数return语句导致错误。

这是我的功能:

-(NSArray *)get_data:(NSString *)size {

    // Set up the data request.
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://mywebsite.com/info.json"]];
    NSURLRequest *url_request = [NSURLRequest requestWithURL:url];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    // Begin the asynchronous data loading.
    [NSURLConnection sendAsynchronousRequest:url_request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        if (error == nil) {

            // Convert the response JSON data to a dictionary object.
            NSError *my_error = nil;
            NSDictionary *feed = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&my_error];

            if (feed != nil) {

                // Store the returned data in the data array.
                NSArray *topping_data;

                for (int loop = 0; loop < [[feed objectForKey:@"toppings_data"] count]; loop++) {

                    NSString *size_name = [NSString stringWithFormat:@"%@", [[[feed objectForKey:@"toppings_data"] objectAtIndex:loop] valueForKey:@"Size"]];

                    if ([size_name isEqualToString:size]) {
                        topping_data = [[feed objectForKey:@"toppings_data"] objectAtIndex:loop];
                    }
                }

                return topping_data;
            }

            else {
                return @[@"no data"];
            }
        }

        else {
            return @[@"no data"];
        }
    }];
}

我在代码行[NSURLConnection sendAsync....上收到以下错误消息:

  

不兼容的块指针类型发送&#NS; NSArray *(^)(NSURLResponse   * __ strong,NSData * __ strong,NSError * __ strong)&#39;参数类型&#39; void(^ _Nonnull)(NSURLResponse * _Nullable __strong,NSData *   _Nullable __strong,NSError * _Nullable __strong)&#39;

我在这里做错了什么?

我试图避免的是,在异步请求完成之前返回的函数。否则该函数将不会返回任何数据,这不是我想要的。

谢谢你的时间,Dan。

3 个答案:

答案 0 :(得分:3)

在异步块中返回数据的最佳方法是将块回调作为函数和回调的参数返回值:

- (void)get_data:(NSString *)size completionHandler:(void (^)(NSArray *array))completionHandler {
    // ...
    [NSURLConnection sendAsynchronousRequest:url_request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        // ...
        completionHandler(array);
        // ...
    }];
}

使用:

    [self get_data:someString completionHandler:^(NSArray *array) {
       // process array here
    }];

答案 1 :(得分:2)

该块不返回任何内容:

void ^(NSURLResponse *, NSData *, NSError *)

所以你不能回报:

return @[@"no data"];

调用块的代码对它返回的内容不感兴趣;如果要存储状态,则添加实例变量或调用方法。

答案 2 :(得分:0)

更改

[NSURLConnection sendAsynchronousRequest:url_request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

[NSURLConnection sendAsynchronousRequest:url_request queue:queue completionHandler:^(NSURLResponse *_Nullable response, NSData *_Nullable data, NSError *_Nullable error)