メソッドを介してデリゲートを別のオブジェクトに渡そうとしています。短時間は機能しますが、その後nullになります。私はそれを引き起こしているものを理解したと思いますが、それを解決する方法は理解していません。
そのため、iOSのブロックは、参照されているすべての変数を自動的にコピーします。ユーザーがデリゲートオブジェクトを渡すメソッドがあります。管理対象オブジェクトコンテキストに対してブロックが実行され、管理対象オブジェクトコンテキストが、デリゲートが渡されるWebリクエストを作成します。私が起こっていると思うのは、このブロックがデリゲートオブジェクトのコピーを作成し、それをリクエストに渡すことですが、ブロックは実行を終了し、デリゲートが解放されます。
ブロックがコピーを作成するのではなく、元のデリゲートオブジェクトを単純に渡す方法はありますか?
NSManagedObjectContext *context = [[MPCoreDataManager sharedInstance] managedObjectContext];
[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.delegate = delegate;
[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);
}
}];
これは私が使用しているコードです。ご覧のとおり、ここではデリゲートが使用されていますobjRequest.delegate = delegate;
が、オリジナルではなくコピーであるため、ARCによってリリースされています。
どうすればこれを回避できますか