1

저는 Objective-C를 다소 새로 도입했습니다. 클라이언트 인증서 인증이 필요한 사이트에서 파일을 다운로드하는 PERL 스크립트가 있습니다. PERL의 스크립트를 Objective-C 명령 줄 도구로 이식하여 터미널에서 실행할 수 있습니다. 내 연구를 토대로 NSURLSession이 내가해야 할 일을해야한다고 결론을 내렸다. 그러나 NSURLSession을 명령 줄 도구로 사용할 수 없습니다. 그것은 오류없이 괜찮아 질 것 같지만 completionHandler에서 아무 것도 반환하지 않습니다. 또한이 코드를 Mac OS X App 도구에 넣었습니다. 제대로 작동하는 것 같습니다. 당신이 볼 수 있듯이명령 줄 도구로 실행할 때 NSURLSession이 completionHandler를 처리하도록하려면 어떻게해야합니까?

#import "RBC_ConnectDelegate.h" 

@implementation RBC_ConnectDelegate 

- (void)GetURL2:(NSURL *)myURL2{ 
    //create semaphore 
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
    // Create the request. 
    NSLog(@"Creating Request"); 
    NSURLRequest *theRequest = 
    [NSURLRequest requestWithURL:myURL2 
        cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
       timeoutInterval:10.0]; 
    NSLog(@"Creating Session"); 
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; 
    NSLog(@"Initializing Data Task"); 
    NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithRequest:theRequest 
          completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

           NSLog(@"CompletionHandler"); 

           if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 
            NSInteger myStatusCode = [(NSHTTPURLResponse *) response statusCode]; 
            NSLog(@"Status Code: %ld", (long)myStatusCode); 

           } 



           if(error == nil) 
           { 
            NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
            NSLog(@"Data = %@",text); 
           } 
           else 
           { 
           NSLog(@"Error"); 
           } 
      dispatch_semaphore_signal(semaphore); 
                 }]; 

    NSLog(@"Resuming Data Task"); 
    [dataTask resume]; 
} 
@end 

: 내 구현 파일 여기

#import <Foundation/Foundation.h> 


@interface RBC_ConnectDelegate : NSObject 

- (void)GetURL2:(NSURL *)myURL; 

@property(nonatomic,assign) NSMutableData *receivedData; 
//<==== note use assign, not retain 
//do not release receivedData in a the dealloc method! 

@end 

된다 : 여기

#import <Foundation/Foundation.h> 
#import "RBC_ConnectDelegate.h" 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     // insert code here... 

     NSURL *myURL =[NSURL URLWithString:@"http://google.com"]; 

     //[[[RBC_Connect alloc] init] connectGetURLSynch]; 
     RBC_ConnectDelegate *myConnect = [[RBC_ConnectDelegate alloc] init]; 
     [myConnect GetURL2: myURL]; 


    } 
    return 0; 
} 

내 구현 파일입니다 : 여기

내 main.m 파일입니다 , 나는 처음에 여기에서 일하는 아주 간단한 것을 얻고 자 노력하고있다. NSURLSession이 비동기 적으로 실행된다는 사실과 관련이있을 수도 있지만 명령 줄 도구를 작성할 때이 문제를 해결하는 방법을 구체적으로 설명하는 솔루션을 찾을 수 없었습니다. 누구든지 제공 할 수있는 방향으로 인정 될 것입니다.

환호,

답변

1

NSOperationQueue의 참조 +mainQueue를 들어, 메인 쓰레드의 실행 루프 작업의 실행을 제어하는 ​​것을 말한다, 그래서 당신은 실행 루프가 필요합니다. 당신의 main의 끝이 추가

while (1) 
{ 
    SInt32 res = 0; 
    @autoreleasepool 
    { 
     res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, DBL_MAX, false); 
    } 

    if (kCFRunLoopRunStopped == res || kCFRunLoopRunFinished == res) 
     break; 
} 

-GetURL2: 전화 -[NSOperationQueue addOperation:] 또는 dispatch_async을 사용합니다. CFRunLoopStop으로 실행을 중지 할 수 있습니다. NSOperations 대신 GCD로 테스트했지만 어쨌든 작동합니다. URL 세션이 완료된 후에 동기화하려면 dispatch_semaphore_wait으로 전화해야합니다.

관련 문제