私は何が起こっているのかを知っていると確信していますが、それを防ぐ良い方法があるかどうか知りたいです。
基本的に、コアデータストアから何かを検索するクラスメソッドがあり、何も存在しない場合は、Webサーバーからそれをフェッチしようとします。コアデータのルックアップとリクエストは、管理対象オブジェクトコンテキストperformBlock
メソッドで実行されます。
次のコードブロックがあります。
[context performBlock:^{
__block NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([self class])];
[request setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:key ascending:asc selector:@selector(caseInsensitiveCompare:)]]];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:keyPath
cacheName:nil];
[controller performFetch:&error];
if (!controller.fetchedObjects || controller.fetchedObjects.count == 0) {
// Nothing found or an error, query the server instead
NSString *url = [NSString stringWithFormat:@"%@%@", kMP_BASE_API_URL, [self baseURL]];
MPRequest *objRequest = [MPRequest requestWithURL:url];
[objRequest setRequestMethod:@"GET"];
[MPUser signRequest:objRequest];
[objRequest submit:^(MPResponse *resp, NSError *err) {
if (err) {
block(nil, err);
} else {
NSArray *objects = [self createListWithResponse:resp];
objects = [MPModel saveAllLocally:objects forEntityName:NSStringFromClass([self class])];
[controller performFetch:&error];
block(controller, nil);
}
}];
} else {
// Great, we found something :)
block (controller, nil);
}
}];
何が起こっているのかというと、MPRequestオブジェクトが作成されて起動されますが、submitメソッドは非同期要求をトリガーするため、ほぼ瞬時に戻ります。その後、ARCがMPRequestオブジェクトを解放していると思います。リクエストが実行されると、ARCがリリースしたため、内部リクエストオブジェクトのデリゲートは存在しなくなります(MPRequestオブジェクトは、それが持つ内部リクエストのデリゲートです)。このため、submitメソッドが提供されているブロックは呼び出されません。
リクエストを同期せずにARCがこれを行うのを防ぐ方法はありますか?
編集
のsubmit
方法はMPRequest
次のようになります
_completionBlock = block;
_responseData = [[NSMutableData alloc] init];
[self prepareRequest];
[self prepareRequestHeaders];
_connection = [[NSURLConnection alloc] initWithRequest:_urlRequest
delegate:self];
[self requestStarted];