2014-04-01 2 views
1

AFNetworking을 사용하여 내 앱의 배경에 표시 할 이미지를로드하려고합니다. 문제는 viewDidLoad 이미지로드를 호출 할 때, AFNetworking이 데이터 로딩을 완료하지 않았기 때문에 표시되지 않습니다.AFNetworking 2.0 & Background Image

여기 내 코드. AFNetworking

:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    // 3 
    NSDictionary *user = (NSDictionary *)responseObject; 

    NSString *backurlJSON=[user valueForKeyPath:@"back_url"][0]; 
    NSLog(@"Background from Start: %@",backurlJSON); 

    if(![backurlJSON isEqualToString:@""]){ 

     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.mydomain.com/images/%@", backurlJSON]]; 
     NSData *data = [[NSData alloc]initWithContentsOfURL:url ]; 
     imgBack = [[UIImage alloc]initWithData:data ]; 

     backgroundView = [[UIImageView alloc] initWithImage: imgBack]; 

는 그래서 viewDidLoad에 내가 UIImageView 이미지를로드 하위 뷰를 가지고, 경우에로드 할 이미지를 내가 하나가 에서 오는 덮어 쓰기를 좋아하는 것,이 없다 AFNetworking.

의 viewDidLoad :

background = [UIImage imageNamed: @"2.png"]; 
backgroundView = [[UIImageView alloc] initWithImage: background]; 
backgroundView.frame = CGRectMake(-10, -10, 340, 588); 
backgroundView.contentMode = UIViewContentModeScaleAspectFill; 
[self.view addSubview:backgroundView]; 

어떤 생각 방법이 작업을 수행하려면?

답변

1

대신

[backgroundView performSelectorOnMainThread:@selector(setImage:) withObject:imgBack waitUntilDone:NO]; 

: 이미지 뷰의 이미지 속성을 변경하는 대신 새로운 하나를 만들어보십시오 , 당신은 대신이 코드의 메인 스레드에서 이미지를 다운로드 :

:

if(![backurlJSON isEqualToString:@""]){ 

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.mydomain.com/images/%@", backurlJSON]]; 
    NSData *data = [[NSData alloc]initWithContentsOfURL:url ]; 
    imgBack = [[UIImage alloc]initWithData:data ]; 

    backgroundView = [[UIImageView alloc] initWithImage: imgBack]; 
} 

당신은 같은 것을 사용할 수 있습니다

NSString *backurlJSON=[user valueForKeyPath:@"back_url"][0]; 
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.mydomain.com/images/%@", backurlJSON]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 


    AFHTTPRequestOperation *postOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    postOperation.responseSerializer = [AFImageResponseSerializer serializer]; 
    [postOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     backgroundView.image = responseObject; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Image error: %@", error); 
    }]; 
+1

이 작품은 완벽하게 고마워요! –

1

UIImageView를 덮어 쓰는 것 같아 보이지 않으며 뷰 계층 구조에 다시 추가하지 않는 것처럼 보입니다. , 당신은 'back_url'와 JSON 파일을 다운로드 AFNetworking를 사용하는 코드와

backgroundView = [[UIImageView alloc] initWithImage: imgBack]; 
+0

필자는'dispatch_async (dispatch_get_main_queue(),^{/ * 메인 스레드에서 물건을 처리하십시오/*}),'performSelectorOnMainThread : withObject : waitUntilDone :'에 개인적으로 선호합니다. 기본적으로 하나의 작업 만 수행하고 하나 이상의 매개 변수 만 필요로하는 경우에만 작동한다는 점을 제외하면 본질적으로 잘못된 방식은 없습니다. – aapierce