Objective c 释放块或取消块objc
我使用一个类进行所有网络调用以获取数据Objective c 释放块或取消块objc,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我使用一个类进行所有网络调用以获取数据 // Helper Class method for network calls - (void) dataForUser:user withCompletionHandler:(void(^)(id response)) onComplete { [[webClient sharedObject] fetchDataForUser:user withCompletionHandler:(void(^)(id response)) onComple
// Helper Class method for network calls
- (void) dataForUser:user withCompletionHandler:(void(^)(id response)) onComplete {
[[webClient sharedObject] fetchDataForUser:user withCompletionHandler:(void(^)(id response)) onComplete {
// do something to get data
onComplete(data);
}];
}
// View Controller's Model Class
- (void) getDataWithCompletionHandler:(void(^)(id)) onComplete {
// helperClassObj is a class variable
[helperClassObj dataForUser:userInfo withCompletionHandler:^(id response) {
// process response and store it as response 1.
onComplete(response1);
}];
}
在一个请求完成之前,我不能再提出另一个请求。我怎样才能取消以前的请求,这样我就不必等到获得数据了。就像我为
user1
请求数据和为user2
请求数据一样,我需要显示user2
数据并能够取消上一次通话。为什么不能打两次电话?为什么有那么多方法具有相同的签名?为什么不将用户与响应一起传递到块中?取消取决于web服务获取数据的方式…@Wain如果我调用该方法两次,并且如果在接收到用户2数据后接收到用户1的数据,则视图将显示用户1的数据。所以我不能打两次电话。我们会,如果你有用户数据和响应,你可以验证。您是如何下载的?请使用AFNetworking library。此库上的每个请求都用NSOperation包装,可以简单地取消。这不处理请求首先完成的竞争条件。这是提供API的唯一可能的解决方案。我知道最好将请求包装到NSOperation中,并使用[operation cancel]
方法。强烈建议@user88975使用AFNetworking及其操作方法。因此,您应该将其添加到您的答案中,并解释原因;-)@Wain内部使用Restkit,intern使用AF1.0。但这是另一个二进制文件,我无法访问它。所以我需要从外面找到一条路。如图所示,我可以使用bool进行跟踪。如果有什么事,请告诉我better@Wain这就是调用二进制/框架的共享对象的块。
// Helper Class method for network calls
- (void) dataForUser:user withCompletionHandler:(void(^)(id response)) onComplete {
[webClient fetchDataForUser:user withCompletionHandler:^(id response) {
// do something to get data
if(onComplete) {
onComplete(data);
}
}];
}
// View Controller's Model Class
BOOL isLastRequestCancelled = NO;
- (void) getDataWithCompletionHandler:(void(^)(id)) onComplete {
isLastRequestCancelled = YES;
// helperClassObj is a class variable
[helperClassObj dataForUser:userInfo withCompletionHandler:^(id response) {
// process response and store it as response1
if(!isLastRequestCancelled) {
if(onComplete) {
onComplete(response1);
}
}
isLastRequestCancelled = NO;
}];
}