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;
    }];
}