ios - 来自两个 API 的一个 TableView

标签 ios objective-c api uitableview

有没有办法让我使用两个单独的网络 API 填充一个 UITableView?我确定有,但我不太明白。

目前我正在完美地从一个网络 API 中提取;但我需要从另一个中提取,然后将它们合并到一个 UITableView 中。

(我正在使用 RestKit)

(我尝试集成的第二个 API 是 Instagram,将从用户帐户中提取图片/文本)

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // RestKit
    NSString *baseURL = @"http://api.firstwebsite.com/v1";
    RKObjectManager *manager = [RKObjectManager sharedManager];

    if (!manager) {
        manager = [RKObjectManager objectManagerWithBaseURLString:baseURL];
        manager.client.serviceUnavailableAlertEnabled = YES;
        manager.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;
    } else {
        manager.client.baseURL = [RKURL URLWithString:baseURL];
    }

    return YES;
}

WebListViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:
    [NSString stringWithFormat:
    @"/something/?limit=100&something=%@&something=%@&apikey=xxxx", var1, var2]
    usingBlock:^(RKObjectLoader *loader) {
        loader.onDidLoadObjects = ^(NSArray *objects){

            hArray = objects;

            [_tableView reloadData];

        };
        [loader.mappingProvider setMapping:[Fe mapping] forKeyPath:@"fe"];
        loader.onDidLoadResponse = ^(RKResponse *response){
            //NSLog(@"BodyAsString: %@", [response bodyAsString]);
        };
    }];
}

我假设我需要在 AppDelegate.m 中使用 baseURL 做一些不同的事情,因为它将有两个不同的基本 URL。

谢谢!将根据需要发布任何额外的代码!

编辑

根据 alexandresoli 的回答,这是我目前已更新的内容,但仍需要帮助:

WebListViewController.m

@property (strong, nonatomic) NSMutableArray *array;
@synthesize array;

- (void)callBothURLs {
    // Call both #1 and #2 URL, not sure what specific code goes here
}

- (void)viewDidLoad {
    [self callBothURLs];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // This is what I currently have, was pulling from a `Headlines` `NSArray` from web #1
    return headlinesArray.count;
    // I believe I need to change it to this next line...
    //return array.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Not sure what to put here with the new `NSMutableArray`
}

编辑 2

我已经为第一个网站设置了对象映射,因此我可以轻松地为 Instagram API 完成这部分工作。我所有的困惑/问题似乎都在 WebListViewController 中。不管怎样,这是一个映射示例。

映射.h

@interface Mapping : NSObject

@property (nonatomic, strong) Links *links;
@property (nonatomic, strong) NSString *headline;
@property (nonatomic, strong) NSArray *images;

+ (RKObjectMapping *) mapping;

@end

映射.m

@implementation Mapping

+ (RKObjectMapping *)mapping {
    RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[self class] usingBlock:^(RKObjectMapping *mapping) {
        [mapping mapKeyPathsToAttributes:
         @"headline", @"headline",
         nil];
        [mapping hasMany:@"images" withMapping:[Images mapping]];
    }];

    return objectMapping;
}

@end

最佳答案

创建一个调用两个 url 的方法,并使用 addObject 方法将每个 url 的结果存储在同一个 NSMutableArray 中。

NSMutableArray *array = [NSMutableArray new];

// for each object from URL 1, call [array addObject:object];

// for each object from URL 2, call [array addObject:object];

使用这个数组作为你的tableview的数据源;

按要求更新:

  • 您可以从 viewDidLoad 调用 populateBothUrlsMethod。
  • 之后,将常规的 uitableview 数据源方法 numberOfSectionsInTableView 和 numberOfRowsInSection 与这个新填充的数组一起使用。

更新 2:

- (void)viewDidLoad
{
    [super viewDidLoad];


    _array = [NSMutableArray new];


    // fetch data from url 1
    NSArray *arrayUrl1 = [self fetchUrl1];


    // add url1 data to array
    for (NSString *str in arrayUrl1) {
        [_array addObject:str];
    }


    // fetch data from url 2
    NSArray *arrayUrl2 = [self fetchUrl2];

    // add url2 data to array
    for (NSString *str in arrayUrl2) {
        [_array addObject:str];
    }

}


- (NSArray *)fetchUrl1
{
    return [NSArray array];
}

- (NSArray *)fetchUrl2
{
    return [NSArray array];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // total number of objects in array
    return [_array count];
}

关于ios - 来自两个 API 的一个 TableView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743840/

相关文章:

ios - 为 UIView 创建动画以与 UINavigationController 推送/弹出一致

iphone - UIWebView 的属性 scalesPageToFit = YES 在较大的图像上无法正常工作

ios - 从 USB 连接的 iOS 设备进行截屏/镜像

objective-c - PKAddPassPaymentRequest 无法发送请求

objective-c - iPad 的 kal 日历的 UI 问题?

api - Azure DevOps API : Get all files (source and target) of Pull Request

ios - Swift - 在不初始化 Controller 的情况下调用函数

ios - 来自 NSInputStream 的 UIImage

rest - 带有正文的 RESTful API 的 HTTP GET 请求

api - 适用于主要零售业的礼品卡 API