0Pricing
Objective-C iOS Development for Legacy & Enterprise Apps · 강의

API 호출을 위한 NSURLSession

NSURLSession으로 네트워크 요청을 수행하고 응답을 처리하며 RESTful API와 데이터를 주고받습니다.

API 호출을 위한 NSURLSession은(는) CoddyKit의 무료 Objective-C iOS Development for Legacy & Enterprise Apps 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Objective-C iOS Development for Legacy & Enterprise Apps 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Objective-C iOS Development for Legacy & Enterprise Apps 강의에는 총 4개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

Connecting Your App to the World

Mobile apps often need to talk to the internet to fetch or send data. This is called networking.

Think of checking the weather, loading your social media feed, or sending a message. All these involve your app making requests to a server.

Servers expose APIs (Application Programming Interfaces), which are sets of rules for how your app can interact with them. Many modern APIs follow the REST architectural style.

Meet NSURLSession

In Objective-C, the primary way to perform network requests is using NSURLSession. It's a powerful and flexible API for downloading content over HTTP/HTTPS.

  • It replaced older methods like NSURLConnection.
  • It handles data tasks, download tasks, and upload tasks.
  • It supports background transfers and authentication.

NSURLSession makes network communication more efficient and easier to manage.

NSURLSession's Building Blocks

NSURLSession works with a few key components:

  • NSURLSession: The main object that coordinates network tasks.
  • NSURLSessionConfiguration: Defines the behavior of a session (e.g., caching, timeouts, cellular access).
  • NSURLSessionTask: An abstract class for tasks. Concrete subclasses include NSURLSessionDataTask (for data), NSURLSessionDownloadTask (for files), and NSURLSessionUploadTask (for uploading files).

Making a Simple GET Request

Let's make a basic GET request to fetch data from a server. A GET request is used to retrieve information.

We'll use NSURLSessionDataTask. This task takes a URL and a completion handler (a block of code) that runs when the request finishes.

Remember to call [task resume]; to start the task!

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 1. Create a URL
        NSURL *url = [NSURL URLWithString:@"https://jsonplaceholder.typicode.com/todos/1"];

        // 2. Create a session (using the default shared session)
        NSURLSession *session = [NSURLSession sharedSession];

        // 3. Create a data task
        NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if (error) {
                NSLog(@"Error: %@", error.localizedDescription);
            } else {
                // Check for HTTP status code (e.g., 200 OK)
                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                if (httpResponse.statusCode == 200) {
                    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                    NSLog(@"Response Data: %@", responseString);
                } else {
                    NSLog(@"Server returned status code: %ld", (long)httpResponse.statusCode);
                }
            }
            CFRunLoopStop(CFRunLoopGetCurrent()); // Stop the run loop once task finishes
        }];

        // 4. Start the task
        [dataTask resume];

        // Keep the main thread alive until the async task completes
        CFRunLoopRun();
    }
    return 0;
}

Understanding the Response

The completion handler block for a data task provides three parameters:

  • data: The raw data received from the server (e.g., JSON, image bytes).
  • response: An NSURLResponse object, which can be cast to NSHTTPURLResponse for HTTP-specific details like status codes (200 OK, 404 Not Found, etc.) and headers.
  • error: An NSError object if something went wrong during the request (e.g., no internet connection, server unreachable).

Always check for error first, then the HTTP status code.

Decoding JSON Responses

Most REST APIs return data in JSON (JavaScript Object Notation) format. This is a lightweight, human-readable data interchange format.

Objective-C provides NSJSONSerialization to convert raw NSData into Objective-C objects (NSDictionary or NSArray) and vice-versa.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSURL *url = [NSURL URLWithString:@"https://jsonplaceholder.typicode.com/todos/1"];
        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if (error) {
                NSLog(@"Error: %@", error.localizedDescription);
            } else {
                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                if (httpResponse.statusCode == 200) {
                    NSError *jsonError = nil;
                    // Attempt to parse JSON data
                    id jsonObject = [NSJSONSerialization JSONObjectWithData:data
                                                                    options:0 // No special options
                                                                      error:&jsonError];
                    if (jsonError) {
                        NSLog(@"JSON Parsing Error: %@", jsonError.localizedDescription);
                    } else if ([jsonObject isKindOfClass:[NSDictionary class]]) {
                        NSDictionary *todoItem = (NSDictionary *)jsonObject;
                        NSLog(@"Todo Title: %@", todoItem[@"title"]);
                        NSLog(@"Completed: %@", todoItem[@"completed"] ? @"YES" : @"NO");
                    } else {
                        NSLog(@"Received unexpected JSON format.");
                    }
                } else {
                    NSLog(@"Server returned status code: %ld", (long)httpResponse.statusCode);
                }
            }
            CFRunLoopStop(CFRunLoopGetCurrent());
        }];
        [dataTask resume];
        CFRunLoopRun();
    }
    return 0;
}

Tailoring NSURLSession with Configuration

For more control, you can create a custom NSURLSession using an NSURLSessionConfiguration object.

Common configurations include:

  • defaultSessionConfiguration: Uses a global shared cookie storage, credential storage, and disk-based cache.
  • ephemeralSessionConfiguration: Similar to default, but stores no data to disk (e.g., no caches, cookies). Ideal for private browsing.
  • backgroundSessionConfigurationWithIdentifier:: Allows transfers to continue when your app is suspended or terminated.

You can set properties like timeoutIntervalForRequest, HTTPAdditionalHeaders, and more.

Sending Data with POST

While GET retrieves data, POST requests are used to send new data to the server (e.g., submitting a form, creating a new resource).

For POST, you typically create an NSURLRequest object, set its HTTP method to "POST", and attach the data you want to send as HTTPBody.

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSURL *url = [NSURL URLWithString:@"https://jsonplaceholder.typicode.com/posts"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        request.HTTPMethod = @"POST"; // Set HTTP method to POST

        // Prepare data to send (e.g., a new post title and body)
        NSDictionary *postData = @{
            @"title": @"foo",
            @"body": @"bar",
            @"userId": @1
        };
        NSError *jsonError = nil;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:postData options:0 error:&jsonError];

        if (jsonError) {
            NSLog(@"JSON serialization error: %@", jsonError.localizedDescription);
            CFRunLoopStop(CFRunLoopGetCurrent());
            return 1;
        }

        request.HTTPBody = jsonData;
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];

        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            if (error) {
                NSLog(@"Error: %@", error.localizedDescription);
            } else {
                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                if (httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
                    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                    NSLog(@"POST Success! Response: %@", responseString);
                } else {
                    NSLog(@"Server returned status code: %ld", (long)httpResponse.statusCode);
                }
            }
            CFRunLoopStop(CFRunLoopGetCurrent());
        }];
        [dataTask resume];
        CFRunLoopRun();
    }
    return 0;
}

Handling Network Errors Gracefully

Network requests can fail for many reasons. Robust error handling is crucial for a good user experience.

  • Check the error object first: This indicates fundamental issues like no internet, DNS lookup failure, or server connection problems.
  • Check NSHTTPURLResponse status code: After confirming no error, check the HTTP status code (e.g., 400 Bad Request, 401 Unauthorized, 500 Internal Server Error).
  • Provide user feedback: Inform the user about the issue, e.g., "No internet connection" or "Could not load data."

Always assume network requests can fail and plan for it!

Quick Check: NSURLSession

Consider the following Objective-C code snippet for a network request:

NSURL *url = [NSURL URLWithString:@"https://example.com/data"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error) {
        NSLog(@"Failed with error: %@", error.localizedDescription);
    } else {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if (httpResponse.statusCode == 200) {
            NSLog(@"Data received!");
        } else {
            NSLog(@"HTTP Status: %ld", (long)httpResponse.statusCode);
        }
    }
}];
// Missing line here

Recap: Mastering NSURLSession

In this lesson, we explored how to perform network requests using NSURLSession in Objective-C.

  • We learned about NSURLSession, NSURLSessionConfiguration, and NSURLSessionTask.
  • You can make GET requests to fetch data and POST requests to send data.
  • We covered how to handle the response, including checking for errors and parsing JSON data using NSJSONSerialization.
  • Always remember to call [task resume]; to start a task and implement robust error handling.

Next, you'll dive into concurrency with Grand Central Dispatch to keep your UI responsive during network operations!

자주 묻는 질문

“API 호출을 위한 NSURLSession” 강의는 무료인가요?

네 — “API 호출을 위한 NSURLSession” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Objective-C iOS Development for Legacy & Enterprise Apps 강의 전체를 잠금 해제할 수 있습니다. Objective-C iOS Development for Legacy & Enterprise Apps 강의에는 총 4개의 강의가 포함되어 있습니다.

“API 호출을 위한 NSURLSession”에서 뭘 배우나요?

NSURLSession으로 네트워크 요청을 수행하고 응답을 처리하며 RESTful API와 데이터를 주고받습니다. 브라우저에서 직접 실행하는 실습 코드로 Objective-C iOS Development for Legacy & Enterprise Apps을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Objective-C iOS Development for Legacy & Enterprise Apps을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Objective-C iOS Development for Legacy & Enterprise Apps은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“API 호출을 위한 NSURLSession” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Objective-C iOS Development for Legacy & Enterprise Apps 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Objective-C iOS Development for Legacy & Enterprise Apps 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. API 호출을 위한 NSURLSession
  2. Grand Central Dispatch(GCD)
  3. 복잡한 작업을 위한 NSOperationQueue
  4. NSJSONSerialization으로 JSON 파싱하기
← Objective-C iOS Development for Legacy & Enterprise Apps(으)로 돌아가기