我在带有Rails / Heroku后端的iOS应用程序上看到了奇怪的行为。我会尽量提供尽可能详细的信息。希望有人可以指出可能出现问题的几个可能区域。
我使用XCode 5编写了一个iOS 7应用程序,用户可以登录并发布新文章和评论。我正在使用AFNetworking库与我的后端服务器(Rails 4,Heroku& Postgres)进行通信。我正在使用JSON格式进行POST和GETing,因此我使用AFJSONRequsetOperation来处理通信。
我的所有帖子都使用这种方法:
- (void) Post:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON))success
:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON))failure
// allocate a reachability object
Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];
reach.unreachableBlock = ^(Reachability*reach)
{
dispatch_async(dispatch_get_main_queue(), ^{
UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
[HUD flashMessage :@"Whoops" :@"No internet connection" :window];
});
failure(nil, nil, nil, nil);
};
reach.reachableBlock = ^(Reachability*reach)
{
// prepare base URL and calculate signature
// Something like: https://myapp.herokuapp.com
NSURL *url = [NSURL URLWithString:BasePath];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
[httpClient setDefaultHeader:@"Accept" value:@"application/json"];
// Generates the POST URL
// Something like: https://myapp.herokuapp.com/api/v1/articles.json
NSString *basePath = [self GetPostURL];
NSLog(@"Post %@ With parameters: %@", basePath, Parameters);
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:basePath parameters:Parameters];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:success failure:failure];
[operation start];
};
[reach startNotifier];
}
我在iPhone 5上进行了一些测试。查看tableview中的文章列表,在详细视图中查看文章详细信息,然后查看另一个tableview以查看和添加注释。我做了很多测试,发现没有问题。最后我看到有3条完全相同的评论。我想我必须双击“添加”#39;按钮因此禁用按钮。我认为没有更多关于它,因为它几乎不可能重新创建。
我已将手机更新到iOS 8并更新了我的XCode和SDK以反映这一点。 我把这个应用程序放在我的朋友手机上(iOS 8和iPhone 5 C)。她用了一天没有看到任何问题。她查看了文章,评论并添加了自己的文章,没有任何问题。
今天是一个不同的故事。 首先,一些背景信息。当您打开应用程序时 - 我刷新文章列表以便应用程序通常显示旧的文章列表,然后会出现加载图标,桌面视图闪烁并显示最新文章。
当她今天打开应用程序时 - 它闪了好几次,看起来像10个左右。当tableview出现时,她昨天发布的文章出现了两次。确切的文章(标题,描述,纬度/经度,图像)出现两次但有不同的时间戳。
我以为应用程序正在她的手机上播放,所以我检查了后端。它有两个单独的文章,不同的ID和时间戳,但另外一个精确的副本。
查看日志,她的帐户有20/30 GET请求。这似乎与开幕时的闪烁相对应。它多次更新tableview。
然后日志显示了一个POST请求,其中包含她前一天发布的所有参数。就好像她今天发布了完全相同的文章 - 但显然她没有。
以前有人见过这种事吗?
我唯一能想到的是:
ArticleListViewController *articleList = (ArticleListViewController *)[self.storyboard instantiateInitialViewController];
articleList.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self articleList animated:YES completion:nil];
我甚至无法复制它,更不用说修复它了。 我认为我指责应用程序是正确的吗?它似乎不是heroku / rails的问题。
非常感谢任何帮助。
更新
我刚刚再次遇到这个问题。 我昨天做了一些测试,增加了3篇文章。一切都按预期工作。我偶尔会每隔几个小时进入应用程序,以确保一切正常。我刚刚打开了应用程序,它开始闪烁/闪烁。它使用我昨天发布的新文章更新了列表。我没有做任何事情,它再次闪烁,同样的文章再次添加(所以这与今天created_at日期重复2)。我继续什么都不做,几秒钟后,我昨天添加的其他2篇文章已经更新。一篇文章被添加了3次,一篇文章被添加了2次,一篇文章被重复了一次。这是奇怪的行为。
是否存在某种全局变量或保留所有数据的东西?也许控制器没有被彻底清除?
布赖恩
答案 0 :(得分:2)
经过无休止的测试。我发现了问题。
重复的POST是随机发生的。当它确实发生时,它似乎只发生1%的时间,有时是5分钟后,有时是一天后。
我最终发现它与从3G切换到WiFi有关。 在3G上添加文章,然后更改为WiFi将导致重复。
问题在于我上面代码中的Reachability块。 我启动了可达性通知程序并设置了两个可达和无法访问的块。 当手机改变可达性状态时,这些块会被击中。因此,从3G转移到Wifi再次点击可达块,导致POST重复。
一个简单的解决方法是在每个块的开头调用以下行以防止进一步更新:
[reach stopNotifier];
或者,实现可达性,如:
-(BOOL)reachable {
Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if(internetStatus == NotReachable) {
return NO;
}
return YES;
}
// In POST method
if([self reachable])
{
// Do POST
}else{
// No connection
}