NSURLConnectionDelegate在一个函数中回调

时间:2014-01-21 15:52:36

标签: ios objective-c nsurlconnection nsurlconnectiondelegate

我正在尝试创建自己的Request类,我打算在整个应用程序中使用它。这是我到目前为止提出的代码。

-(IIWRequest *)initAndLaunchWithDictionnary:(NSDictionary *)dictionnary
{
    self=[super init];
    if (self) {
        // Create the request.
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xxxxx.com/app/"]];

        // Convert data
        SBJsonWriter *jsonWriter = [[SBJsonWriter alloc] init];
        NSString *jsonData = [jsonWriter stringWithObject:dictionnary];
        NSLog(@"jsonData : %@",jsonData);
        NSData *requestData = [jsonData dataUsingEncoding: NSUTF8StringEncoding];
        request.HTTPBody = requestData;

        // This is how we set header fields
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
        [request setHTTPBody: requestData];

        // Create url connection and fire request
        NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
        [self activateNetworkActivityIndicator];
        if (connection) {
            NSLog(@"Connection");
        } else {
            NSLog(@"No connection");
        }
    }
    return self;
}

我已经加入了NSURLConnectionDelegate。我想触发连接回调,例如已完成或确实失败回到之前提到的功能。所有这一切的目标是最终只能调用一种方法,如下所示:

-(IIWRequest *)initAndLaunchWithDictionnary:(NSDictionary *)dictionary inBackgroundWithBlock:^(BOOL succeeded){}

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:1)

我建议你不要使用现有的一个库来调用URL。我所知道的最好的一个是AFNetworking https://github.com/AFNetworking/AFNetworking。有很多例子,它易于使用,我相信你应该顺其自然。

无论如何,如果你想建立自己的课程,我建议你阅读由Kazuki Sakamoto撰写的文章NSURLConnection and grand central dispatch

问候

答案 1 :(得分:1)

使用NSURLConnection类的块方法,它也会降低你的功能sendAsynchronousRequest:queue:completionHandler:

阅读此doc

答案 2 :(得分:0)

如果您使用的是iOS 7,我建议您使用NSURLSession课程,这个新的网络API非常简单。

无论如何,要回答你的问题,你只需要在你的班级中保留回调的引用,并在你从服务器收到一些回复时调用它。

要保留参考,您可以执行以下操作:

// in your .h file
typedef void (^ResponseBlock)(BOOL success);

// in your .m, create a class extension and put declare the block to use it for callback
@interface MyClass ()
{
    ResponseBlock callback;
}

// You can store reference using equal like this
- (void)myMethodRequestWithResponseBlock:(ResponseBlock)responseBlock
{
    callback = responseBlock;
    // statements
}

// And finally, you call back block simple like this:
callback(success);

如果可以的话,再次使用NSURLSession api,您将简化工作。

我希望这对你有帮助。 干杯!