iOS 개발 --- 네트워크 요청 (사용자 정의 요청 관리 클래스, Block 에서 값 전송 문제 해결)
4885 단어 ios네트워크 요청blockBlock 전송 값
이 방법 에 대해 집주인 의 첫 번 째 생각 은 사용자 정의 Manager 류 에 배열 속성 을 추가 하 는 것 입 니 다. 저 는 viewController 에서 get 방법 으로 데 이 터 를 얻 으 면 데 이 터 를 얻 을 수 있 습 니 다. 저 뿐만 아니 라 이런 생각 도 좋 지만 현실 에 맞지 않 습 니 다. 먼저 코드 를 드 리 겠 습 니 다.물론 아래 코드 는 값 을 전달 할 수 없습니다. 모든 국가의 이름 정 보 를 얻 기 위해 서 입 니 다.
/**
*
*/
-(void *)loadCountry
{
//
self.country = [NSArray array];
//
NSDictionary * dict = @{@"access_token":token};
__block __weak CountryManager * copy_self = self;
//
[self.operationManager GET:countryURL parameters:dict success:^void(AFHTTPRequestOperation * operaton, NSData * data) {
NSError * error;
// Json
copy_self.country = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];//
//
if (error)
{
NSLog(@"error = %@",[error localizedDescription]);
}
} failure:^void(AFHTTPRequestOperation * operation, NSError * error) {
NSLog(@"error = %@",[error localizedDescription]);
}];
}
만약 에 우리 가 이런 방법 으로 값 을 전달 하려 면 얻 은 배열 은 block 코드 블록 에 만 값 이 있 을 수 있 습 니 다. 코드 블록 이 나 오 면 우 리 는 viewController 에서 이 방법 으로 값 을 붙 인 것 처럼 생각 하지만 배열 의 값 은 @ [] 입 니 다. 즉, 아무런 값 도 없 는 배열 입 니 다. 이 방법 을 사용 하 는 사람 도 모두 깨 달 았 습 니 다.그것 은 Block 코드 블록 에서 우리 가 수정 한 속성 값 이나 구성원 변수의 값 이 밖으로 전달 되 지 못 하기 때 문 입 니 다. C 언어의 함수 와 비슷 하지만 다 르 기 때 문 입 니 다. 그러면 우 리 는 이 문 제 를 어떻게 해결 해 야 합 니까? 코드 블록 을 해결 하 는 방법 은 당연히 코드 블록 을 사용 해 야 합 니 다.
1. 먼저 Country Manager. h 에서 코드 블록 을 설명 해 야 합 니 다.
//
typedef void(^COY)(NSArray * array);
//
-(void)loadCountry:(COY)coy;
2. Country Manager. m 파일 에서 다음 속성 을 확장 합 니 다.
//
// CountryManager.m
// ( , Block )( )
//
// Created by YueWen on 15/9/15.
// Copyright (c) 2015 YueWen. All rights reserved.
//
#import "CountryManager.h"
#import "AFNetworking.h"
#import "Information.h"
@interface CountryManager ()
//AFNetWorking
@property(nonatomic,strong)AFHTTPRequestOperationManager * operationManager;
//
@property(nonatomic,strong)NSArray * country;
@end
3. 우 리 는 m 에서 방법 을 실현 한다.
/**
*
*
* @param coy
*/
-(void)loadCountry:(COY)coy
{
//
self.country = [NSArray array];
//
NSDictionary * dict = @{@"access_token":token};
__block __weak CountryManager * copy_self = self;
//
[self.operationManager GET:countryURL parameters:dict success:^void(AFHTTPRequestOperation * operation, NSData * data) {
NSError * error;
// Json
copy_self.country = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
//
if (error)
{
NSLog(@"%@",[error localizedDescription]);
}
//
coy(copy_self.country);
} failure:^void(AFHTTPRequestOperation * operation, NSError * error) {
NSLog(@"error = %@",[error localizedDescription]);
}];
}
4. 그러면 우 리 는 view Controller 에서 우리 가 전달 한 배열 을 사용 할 수 있 습 니 다. 다음 과 같 습 니 다.
먼저 성명 하 다
//
// TableViewController.m
// ( , Block )( )
//
// Created by YueWen on 15/9/15.
// Copyright (c) 2015 YueWen. All rights reserved.
//
#import "TableViewController.h"
#import "Information.h"
#import "CountryManager.h"
@interface TableViewController ()
@property(nonatomic,strong)CountryManager * countryManager;
@property(nonatomic,strong)NSArray * countryData;//
@end
그 다음은 저희 가 viewdLoad 에서 사용 하 게 되 었 습 니 다.
#pragma mark -
- (void)viewDidLoad {
[super viewDidLoad];
//
self.countryData = [NSArray array];
//
self.navigationItem.title = @" ";
// CountryManager
self.countryManager = [CountryManager shareCountryManager];
//
__block __weak TableViewController * copy_self = self;
//
[self.countryManager loadCountry:^(NSArray *array) {
//
copy_self.countryData = array;
// tableView
[copy_self.tableView reloadData];
}];
}
아래 tableView 의 설정 도 더 이상 잔소리 하지 않 습 니 다. 핵심 코드 도 이렇게 많 습 니 다. 다른 전송 값 도 이렇게 사용 합 니 다. 성 과 를 살 펴 보 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.