Ios 动态引用变量/对象/数组等

Ios 动态引用变量/对象/数组等,ios,objective-c,Ios,Objective C,这似乎是一项很容易的任务,至少在VB.net中是这样。我只需要根据传递给方法的字符串引用数组。当视图控制器加载时,将调用一个方法并传递一个字符串。将基于此字符串创建URL,并从中提取JSON。我想要的是该方法根据传递的字符串填充适当的数组 在这里,我们看到在“getData”类中使用三个字符串参数“workshop/speaker/exhibitor”之一调用方法“goGetData”: 例如,如果“goGetDate”与“speaker”一起触发,我需要获取speaker数据,然后填充“jso

这似乎是一项很容易的任务,至少在VB.net中是这样。我只需要根据传递给方法的字符串引用数组。当视图控制器加载时,将调用一个方法并传递一个字符串。将基于此字符串创建URL,并从中提取JSON。我想要的是该方法根据传递的字符串填充适当的数组

在这里,我们看到在“getData”类中使用三个字符串参数“workshop/speaker/exhibitor”之一调用方法“goGetData”:

例如,如果“goGetDate”与“speaker”一起触发,我需要获取speaker数据,然后填充“jsonSpeaker”数组。以下是我迄今为止根据方法调用中传递的字符串引用和填充数组的尝试:

#import "getData.h"

@implementation getData



+(void)goGetData:(NSString *)requestedTable
{

getData *getDataInstance = [[getData alloc] init];

[getDataInstance buildArray];
[getDataInstance fetchData:requestedTable];

}

-(void)buildArray{
// I tried putting the arrays in an array but still do no know how to reference them
_jsonAllTables = [[NSMutableArray alloc] initWithObjects:_jsonExhibitor, _jsonSpeaker, _jsonWorkshop, nil];

}

-(void)fetchData:(NSString *)requestedTable{
NSString *varCurrentTable;
varCurrentTable = [NSString stringWithFormat:@"_json%@", requestedTable];
NSString *requestedURL;
requestedURL = [NSString stringWithFormat:@"http://testapi.website.com/api/%@", requestedTable];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestedURL]];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {
     if (response){
         NSHTTPURLResponse *newResp = (NSHTTPURLResponse*)response;

         if (newResp.statusCode == 200) {

             // STUFF FOR TESTING NSLog(@"Response to request: %@ is: %i GOOD", requestedURL, newResp.statusCode);

             if ([data length] >0 && error == nil)
             {
                 // STUFF FOR TESTING NSUInteger indexOfArray = [_jsonAllTables indexOfObject:varCurrentTable];
                 // STUFF FOR TESTING NSString *objectAtIndexOfArray = [_jsonAllTables objectAtIndex:indexOfArray];

             //    This is the part I think I am stuck on:
             //    "CURRENT TABLE TO BE POPULATED" = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

             }
             else if ([data length] == 0 && error == nil)
             {
                 NSLog(@"Nothing was downloaded");
             }
             else if (error != nil)
             {
                 NSLog(@"Error: %@", error);
             }

         } else if (newResp.statusCode == 404){
              NSLog(@"Response to request: %@ is: %i BAD - URL incorrect", requestedURL, newResp.statusCode);
         } else {
             // add more returned status error handling here
         }

     }else{
         NSLog(@"No response received");
     }

 }];
}

@end
谢谢

为了澄清我试图实现的目标,我添加了以下内容:为了节省大量的重复写同样的东西,可能需要在Obj-c中使用以下内容(请原谅语言混乱)


注意,我没有为每个表调用单独的方法,而是每次调用相同的方法,但使用不同的表名参数。我在Xcode中似乎找不到这样的占位符的工作示例。

您可能需要一个异步方法,并通过完成处理程序返回结果:

typedef void(^completion_t)(NSArray* objects, NSError*error);

-(void)fetchData:(NSString *)tableName 
  withCompletion:(completion_t)completionHandler;
用法: 实施: 异步循环 另一个示例,用于加载一组数据:

首先,实现了一个“异步循环”方法:

此方法本身是异步的,因此是完成处理程序

用法: 实施
对于新手来说可能很难,但仍然可以尝试使用它进行网络呼叫。我相信有一个简单的解决方案可以解决您的问题,只是我很难弄清楚您实际想要完成什么。我通过NSURLConnection获得的数据很好,如果我为每个表创建一个方法,并尝试动态,它们都工作得很好,但这并不实际,因为最终将有12个以上的表需要填充。我确实将AFNetworking视为异步传输的另一种方法,以后可能会再讨论它。@CouchDeveloper-我尝试使用一种方法,3次。每次传递不同的参数时。此参数用于a)构建连接URL b)使用返回的数据填充相关数组。暂时将网络代码问题放在一边,
sendAsynchronousRequest
可以作为开始。你从这个请求中得到了什么?JSON?如果是,是哪种容器:JSON数组还是JSON对象?模型的类型是什么(在表视图和单元格中呈现什么)?阵列?(生成一个包含一个部分的简单表视图)NSDictionary?(生成带节的表视图)。请尽量描述你的情况更加准确和明确。谢谢。这种用法证实了我的担忧,即这无法动态完成。奇怪的是,在VB中,您可以简单地创建一个方法,并将该方法放入一个循环中,不管您有多少变量。我问的问题在obj-c中是否不同寻常?如果有1000张桌子呢?您必须将fetchdata:tablename写入1000次?当然,这是可以做到的。如果您的请求不到几个,比如多达8个左右,那么您可以并行调用它们。否则,可以按顺序调用异步任务。这类似于调用N次同步方法,它仍然是异步的:。第三种方法结合了这两种解决方案:拥有一个可以配置“最大并发操作”的并发队列,我想我理解异步连接和检索json数据,但我的主要问题是如何只编写一次方法,并使用不同的参数多次调用它。我编辑了我的主要问题,以举例说明我的意思。请阅读我上面评论中答案的链接。这正是你需要的。我已经快速阅读了,这确实看起来能满足我的需要。抱歉,我完全没有想到第一次点击链接:S也,+1用于“自动”。
NSArray *ListOfTables = [NSArray arrayWithObjects:@"Speaker", @"Exhibitor", @"Workshop", nil];

For i as int = 0 to ListOfTables.count{ 

 [self fetchData:(ListOfTables.objectAtIndex = i) withCompletion:^(NSArray* objects, NSError*error){
    dispatch_async(dispatch_get_main_queue(), ^{
        if (objects) {
            self.(ListOfTables.objectAtIndex = i) = objects;
        }
        else {
            NSLog(@"Error: %error", error);
        }
    });
}];
i++;
Next
};
typedef void(^completion_t)(NSArray* objects, NSError*error);

-(void)fetchData:(NSString *)tableName 
  withCompletion:(completion_t)completionHandler;
- (void) foo {

    [self fetchData:tableName1 withCompletion:^(NSArray* objects, NSError*error){
        dispatch_async(dispatch_get_main_queue(), ^{
            if (objects) {
                self.table1 = objects;
            }
            else {
                NSLog(@"Error: %error", error);
            }
        });
    }];

    [self fetchData:tableName2 withCompletion:^(NSArray* objects, NSError*error){
        dispatch_async(dispatch_get_main_queue(), ^{
            if (objects) {
                self.table2 = objects;
            }
            else {
                NSLog(@"Error: %error", error);
            }
        });
    }];

    [self fetchData:tableName3 withCompletion:^(NSArray* objects, NSError*error){
        dispatch_async(dispatch_get_main_queue(), ^{
            if (objects) {
                self.table3 = objects;
            }
            else {
                NSLog(@"Error: %error", error);
            }
        });
    }];
} 
typedef void(^completion_t)(NSArray* objects, NSError* error);

-(void)fetchData:(NSString *)tableName
  withCompletion:(completion_t)completionHandler
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:tableName]];
    // Setup HTTP headers, e.g. "Accept: application/json", etc.
    ...
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[[NSOperationQueue alloc] init]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
         NSError* err = error;
         NSArray* objects; // final result array as a representation of JSON Array
         if (response) {
             NSHTTPURLResponse *newResp = (NSHTTPURLResponse*)response;
             if (newResp.statusCode == 200) {
                 if ([data length] >0 && error == nil)
                 {
                     NSError* localError;
                     objects = ... // Use NSJSONSerialization to obtain a representation
                     if (objects) {
                         if (completionHandler) {
                             completionHandler(object, nil);
                         }
                         return;
                     }
                     else {
                         err = localError;
                     }
                 }
                 else {
                     err = ...
                 }
             }
         }
         if (objects == nil) {
             assert(err);
             if (completionHandler) {
                 completionHandler(nil, err);
             }
         }
    }];
}
typedef void(^completion_t)(id result, NSError* error);

- (void) fetchObjectsWithTableNames:(NSMutableArray*)tableNames 
         completion:(completion_t)completionHandler;
- (void) foo 
{
    NSArray* tableNames =  @[@"A", @"B", @"C"]; // possibly 1000

    [self fetchObjectsWithTableNames:[tableNames mutableCopy]:^(id result, NSError*error){
        if (error) {
            NSLog(@"Error: %@", error);
        }
        else {
            // finished fetching a bunch of datas with result:
            NSLog(@"Result: %@", result);
        }
    }];
}
- (void) fetchObjectsWithTableNames:(NSMutableArray*)tableNames 
         completion:(completion_t)completionHandler;
{
    if ([tableNames count] > 0) {
        NSString* name = [tableNames firstObject];
        [tableNames removeObjectAtIndex:0];
        [self fetchData:name withCompletion:^(NSArray* objects, NSError*error){
            if (objects) {
                [self.tables addObject:objects];
                [self fetchObjectsWithTableNames:tableNames completion:completionHandler];
            } 
            else  {
               // handle error
            }
        }];
    }
    else {
        // finished
        if (completionHandler) {
            completionHandler(@"finished", nil);
        }
    }
}