我正在尝试通过方法将委托传递给另一个对象。它短暂工作,但随后变为空。我想我已经弄清楚是什么原因造成的,但不知道如何解决它。
因此 iOS 中的 Blocks 会自动复制所有引用的变量。我有一个方法,用户传入一个委托对象。为托管对象上下文执行一个块,该上下文又发出一个 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 发布,因为它是副本而不是原件。
我怎样才能解决这个问题