方法的返回类型是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;
}
谁能帮助我解决这个问题?
最佳答案
正如昆汀已经提到的那样,您不能直接这样做,因为您是在内部执行异步请求。这意味着您的程序将启动请求,然后继续其下一条语句,而不等待请求完成。您应该做的就是
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
}];
}
然后您会称其为
[yourObject startParsing:^(NSArray *parsedData) {
// do something with the parsed data
}];
关于ios - 如何从iOS内部返回方法对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260925/