如何从iOS块内部返回方法对象

1 objective-c return-value nsarray ios objective-c-blocks

返回类型的方法是NSArray,所以当我调用这个方法时,我得到nil或空数组.这是我的方法实现之下:

- (NSArray *)startParsing {
    __block NSArray *array;
    allProductsID = [[NSMutableArray alloc] init];
    NSString *string = [NSString stringWithFormat:@"http://%@:@%@",kPrestaShopAPIKey, kPrestaShopURLString];
    NSURL *url = [NSURL URLWithString:string];

    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

    [manager GET:@"categories/21" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSXMLParser *parser = (NSXMLParser *)responseObject;
        [parser setShouldProcessNamespaces:YES];
        parser.delegate = self;
        [parser parse];
        //NSLog(@"First response %@", responseObject);
        for (int i = 0; i< [[self.xmlShop objectForKey:@"product"] count]; i++) {
            //NSLog(@"Second ID --> %@", [self.xmlShop objectForKey:@"product"][i]);
            NSString *productID = [NSString stringWithFormat:@"products/%@", [[self.xmlShop objectForKey:@"product"][i] objectForKey:@"id"]];
            [allProductsID addObject:productID];
        }
        array = [allProductsID copy];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error occured %@", [error localizedDescription]);
    }];
    return array;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?

luk*_*302 7

正如Quentin已经提到的那样,你不能直接这样做,因为你在内部执行异步请求.这意味着您的程序启动请求,然后继续其下一个语句,并且不等待请求完成.你应该做的是

  • 使请求同步以使程序等待,直到请求完成.但是要注意不要从主线程调用此方法,因为这会阻止您的应用继续响应,直到请求返回.要么
  • 使用块作为startParsing方法的回调(与实际请求回调使用块的方式相同)

这样可以举例如下:

- (void)startParsing:(void (^)(NSArray*))parsingFinished {
    allProductsID = [[NSMutableArray alloc] init];
    NSString *string = [NSString stringWithFormat:@"http://%@:@%@",kPrestaShopAPIKey, kPrestaShopURLString];
    NSURL *url = [NSURL URLWithString:string];

    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

    [manager GET:@"categories/21" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        // do your parsing...
        parsingFinished([allProductsID copy]);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        parsingFinished([[NSArray alloc] init]); 
        // or return nil or provide a parsingFailed callback
    }];
}
Run Code Online (Sandbox Code Playgroud)

然后你会称之为

[yourObject startParsing:^(NSArray *parsedData) {
    // do something with the parsed data
}];
Run Code Online (Sandbox Code Playgroud)