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

标签 ios objective-c nsarray return-value 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;
}

谁能帮助我解决这个问题?

最佳答案

正如昆汀已经提到的那样,您不能直接这样做,因为您是在内部执行异步请求。这意味着您的程序将启动请求,然后继续其下一条语句,而不等待请求完成。您应该做的就是

  • 使请求同步,以使程序等待直到请求完成。但是请注意不要从主线程调用此方法,因为这将阻止您的应用继续响应,直到请求返回为止。
  • 使用一个块作为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/

    相关文章:

    objective-c - 如何忽略 "No visible @interface for X declares the selector"?

    iphone - JSON 响应在 NSArray 中转换后显示空白值

    ios - 如何在我的每个 UITableView 单元格中检索 UISwitch 状态?

    ios - 将 Objective-C block 声明为变量的最佳实践

    ios - 旋转后改变棋盘颜色

    objective-c - 将 NSArray 与 NSMutableArray 进行比较,将 delta 对象添加到 NSMutableArray

    iphone - 独立于标签解析 xml 文件

    ios - iOS模拟器键盘

    ios - 使用 NSFetchedResultsController 在空表上自定义单元格

    ios - ComponentsJoinedByString 的问题