すべてのネットワーク通信に ASIHttpRequest を使用するプロジェクトを継承しました。私たちが使用している特定のバージョンについては不明です。私が言えることは、.h ファイルから、特定のファイルの最も古い作成日が 17/08/10 (ASIDataDecompressor) であるということだけです。
完了ブロックと失敗ブロックを使用しています。何らかの理由で、サーバーが応答しない場合にのみ実際に発生するはずの障害ブロックが頻繁にトリガーされます。私たちのログは正常に見え、エラーが発生した頃にサーバーに問題があったという通知 (Airbrake) を受け取っていないので、今のところ、私たちのサーバーは問題なく、それはアプリであるという前提で先に進んでいます犯人。
Instruments (Leaks) を介してアプリを実行することにしましたが、リクエストを強制的に失敗させると、すぐに最大 27 個のリークが作成されることに驚きました。私はインストゥルメントをうまく使いこなす方法がわからないので、情報を手に入れた今、その情報をどうしたらよいかよくわかりません。
コードを投稿して、目立ったものがないかどうかを確認したいと思いました。
viewDidLoad では、このコードが実行されます
[[MyAPI sharedAPI] getAllHighlights:pageNumber:perPage onSuccess:^(NSString *receivedString,NSString *responseCode) {
[self getResults:receivedString];
if(![responseCode isEqualToString:@"Success"]) {
[self hideProgressView];
appDelegate.isDiscover_RefreshTime=YES;
[[MyAPI sharedAPI] showAlert:responseCode];
} else {
NSString *strLogEvent=@"Discover_Highlights_Loaded Page_";
strLogEvent=[strLogEvent stringByAppendingFormat:@"%i",intPageNumber];
[FlurryAnalytics logEvent:strLogEvent timed:YES];
}
} onFail:^(ASIFormDataRequest *request) {
NSDictionary *parameters = [[MyAPI sharedAPI] prepareFailedRequestData:request file:@"Discover" method:_cmd];
[FlurryAnalytics logEvent:@"Unable_to_Connect_to_Server" withParameters:parameters timed:true];
[self hideProgressView];
appDelegate.isDiscover_RefreshTime=YES;
[[AfarAPI sharedAPI] showAlert:@"Unable to Connect to Server."];
[tblHighlightsGrid reloadData];
[tblListHighlights reloadData];
}];
これらの typedef は、API Singleton の上部で定義されています。
typedef void (^ASIBasicBlockWrapper)(NSString *responseString,NSString *responseCode);
typedef void (^ASIBasicBlockWrapperFail)(ASIFormDataRequest *request);
MyAPISingleton#getAllHighlights...
- (void)getAllHighlights:(NSString *)pageNumber:(NSString *)perPage onSuccess:(ASIBasicBlockWrapper)cb1 onFail:(ASIBasicBlockWrapperFail)cb2{
NSString *access_token= [[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"];
NSString *url = [baseURL stringByAppendingFormat:AFAR_GET_ALL_HIGHLIGHTS_ENDPOINT, pageNumber,perPage];
if (access_token) { url = [url stringByAppendingFormat:ACCESS_TOKEN, access_token]; }
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
[request setRequestMethod:@"GET"];
[request setDelegate:self];
[self executeAsynchronousRequest:request onSuccess:cb1 onFail:cb2];
}
最後に、MyAPI#executeAsynchronousRequest:
- (void) executeAsynchronousRequest:(ASIFormDataRequest *)request onSuccess:(ASIBasicBlockWrapper)cb1 onFail:(ASIBasicBlockWrapperFail)cb2
{
[request setCompletionBlock:^{
int statusCode = [request responseStatusCode];
NSString *statusMessage = [self statusErrorMessage:statusCode];
cb1([request responseString],statusMessage);
}];
[request setFailedBlock:^{
cb2(request);
}];
[request startAsynchronous];
}
27 のリークが作成された理由について、何か目立ったものはありますか?