Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用AFNetworking修改另一个类中的实例-创建API客户端_Ios_Objective C_Json_Uitableview_Afnetworking - Fatal编程技术网

Ios 如何使用AFNetworking修改另一个类中的实例-创建API客户端

Ios 如何使用AFNetworking修改另一个类中的实例-创建API客户端,ios,objective-c,json,uitableview,afnetworking,Ios,Objective C,Json,Uitableview,Afnetworking,有这个问题,因为我正在努力开发我的代码。以前,我在课堂上使用AFNetworking方法,但我得到了4种。我想要的不是按顺序重复,而是具有方法的ApicClient。我实现了一些方法,但我的问题只是其中的两个 因此,在APIClient.m中,我有以下内容: +(void)GetCurrencyInformationFrom:(NSString *)URLString to:(NSArray *) array inThe:(UITableView *) tableView{ NSUser

有这个问题,因为我正在努力开发我的代码。以前,我在课堂上使用AFNetworking方法,但我得到了4种。我想要的不是按顺序重复,而是具有方法的ApicClient。我实现了一些方法,但我的问题只是其中的两个

因此,在APIClient.m中,我有以下内容:

+(void)GetCurrencyInformationFrom:(NSString *)URLString to:(NSArray *) array inThe:(UITableView *) tableView{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // User informations.
    NSString *accessToken = [defaults objectForKey:@"accessToken"];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:accessToken forHTTPHeaderField:@"Token"];

    NSLog(@"access token: %@", accessToken);
    NSLog(@"id: %@", [defaults objectForKey:@"ID"]);

    [manager GET:URLString parameters:nil  success:^(AFHTTPRequestOperation *operation, id responseObject) {
        [self update:array withDictionary:responseObject inThe:tableView];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error 2: %@", error);
    }];
}

+(void)update:(NSArray *)array withDictionary:(NSDictionary *)dictionary inThe:(UITableView *) tableView{
    NSLog(@"Data Count: %lu", [dictionary[@"Data"] count]);
    array = [[NSMutableArray alloc] initWithArray:dictionary[@"Data"]];
    NSLog(@"Array Count: %lu", [array count]);
    [tableView reloadData];
}
这些方法在表视图类中被调用。例如,我在
viewload
中调用的一个类:

NSString *URL = @"http://api-dvzalt.azurewebsites.net/api/Currency/Doviz";

[APIClient GetCurrencyInformationFrom:URL to:currencyArray inThe: tableView];
为了进行调试,我将打印数据计数和数组计数(都可以在update:withDictionary:in:method中找到)以及行数(在table类中)。行数在开始时为零是正常的,因为它是非同步的,但是,在我重新加载tableView之后,即在完成所有操作之后(请参阅更新:withDictionary:in the method中的[tableView reloatData]),行数保持为零,其中数据和数组计数为20。当然,如果没有行,表上什么也没有显示。所以,基本上我的问题是,我给方法的currencyArray在它再次返回到tableView后没有改变,即使它在ApicClient类中改变了

我觉得这是一个简单的错误,但我看不出它在哪里。很高兴你能帮我找到它


谢谢

您是否确保您的
UITableView
设置了正确的数据源


你的
-numberOfSectionsInTableView:
-tableView:numberofrowsinssection:
方法看起来像什么?

我真的不喜欢回答我的问题。然而,在这种情况下,我打赌周围有太多的新手在寻找我遇到的同样的问题。我有4天找不到任何解决方案。我一直在网上搜索和询问,但没有找到我需要的解决方案。也许你不会这样,但如果是第一次,肯定至少需要一天的时间。所以,我将尝试让像我这样的初学者深入理解

首先,创建和拥有像ApicClient这样的类通常是个好主意。它只是一个类,当你们打算从互联网上获取数据时,你们可以很容易地使用它。然而,对于初学者来说,事情变得越来越复杂,因为我们已经习惯了同步执行

如果您试图修改任何类中的任何实例,那么您所要做的只是,不要将该实例提供给像我这样的APIClient(或具有块的类),而是尝试从APIClient获取任何需要的信息。比如,如果我们能够获得来自APIClient的信息,那么在实例自己的类中创建该实例就很容易了。例如,将currencyArray提供给ApicClient,并尝试更新ApicClient中的数组是很困难的。另一方面,从APIClient获取responceObject很容易,它正是来自URL的JSON数据

长话短说,通过这种方式,我将APIClient.m中的代码更改为:

+(void)GetCurrencyInformationFrom:(NSString *)URLString to:(NSArray *) array inThe:(UITableView *) tableView{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // User informations.
    NSString *accessToken = [defaults objectForKey:@"accessToken"];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:accessToken forHTTPHeaderField:@"Token"];

    NSLog(@"access token: %@", accessToken);
    NSLog(@"id: %@", [defaults objectForKey:@"ID"]);

    [manager GET:URLString parameters:nil      success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if(success) success(operation, responseObject)
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if(failure) failure(operation, error)
    }];
}
注意,我不再更新:withDictionary:in:method,因为计划将信息带到实例的类中,并在那里进行更新。不在这里

为了进行更新,让我们调用实例类的
viewLoad
。因此,方法如下所示:

[APIClient GetCurrencyInformationFrom:URL
                              success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                   [self updateCurrencyArrayWithDictionary:responseObject];
                            } 
                              failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                   NSLog(@"Error 2: %@", error);
    }];
同样出于更新的目的,我也在这里添加了更新方法,而不是APIClient,这实际上并不是必需的;相反,我们将使用块类型实例

-(void)updateCurrencyArrayWithDictionary:(NSDictionary *)dictionary{
    currencyArray= [[NSMutableArray alloc] initWithArray:dictionary[@"Data"]];
    [tableView reloadData];
}
请注意,
dictionary[@“Data”]]行可能会根据您的数据而更改

就这样。这只是一个简单的示例,说明如何为应用程序的联网目的创建API客户端


希望,我能在以后的这篇文章中帮助别人。

你真的应该坚持我没有正确使用的可可编码惯例吗?也许你没有正确使用苹果的文档。你能说得更具体一点吗?不管谁投反对票都很容易,解释是很难的。这个问题问得很好。你可能会告诉我它出了什么问题。表格视图的第几部分我做了一个,因为我需要一个。tableView:numberOfRowsInSection取决于currencyArray,我计划通过调用ApicClient的get方法来更改它,
-tableView:numberOfRowsInSection:
返回20?这是我遇到的问题,它没有。在update方法中,数组变成了20,但不幸的是,当它进入表时,它没有保持20。我无法将其带到tableView。原始解决方案不起作用的原因是,要修改ApicClient类中NSArray的值,需要通过引用传递它。在方法中设置“array”变量只会更改该方法中的值,这就是为什么没有更新表视图控制器上的数组属性。区块和单一责任绝对是更好的解决方案。