2014-05-22 2 views
2

:아이폰 OS - API 객체와 컨트롤러 사이의 통신 내가이 일에 대해 궁금

1 무슨 API와 통신 객체와 viewcontrollers

사이의 통신을 설계 할 수있는 효율적이고 쉬운 스케일 방법

2 방법 (확장 성하는 방법을 설계하는 방법, ..) 통신하는 개체 자체를 디자인하는

(내 방식 아래 언급이 지저분하다, 나도 알아,하지만 마감이 미쳤다 지금까지 난 정말 그것에 대해 생각할 시간이 없었다)

은 제가 처리 된 작업을 소개하자.

내가 2-3 API와 통신에 따라 앱은 써야했다입니다. API가 응답 한 약 10-15 가지 방법이있었습니다 (HTTP POST를 통해 전송, JSON 결과). 물론 통신은 비동기 적이어야했습니다.

내 방식 : 그래서 API (짧은 apiComm)와 communicationg 객체가 모든 UIViewControllers에 의해 공유 된

. apiComm은 API가 처리 할 수있는 각각의 메소드가 10-15 개였습니다. 개별 요청 콘텐츠와 큰 변화가 있었다 .. API의 apiComm 받았다 데이터, 그것은 [NSNotificationCenter defaultCenter]에 통지를 게시 = "질문 2

. 즉, apiComm을 사용하고자하는 모든 UIViewController는 알림을 위해 self를 등록하고 수신 통지를 처리하는 메소드를 구현해야했습니다. 일부 UIViewController에 더 많은 API 요청을 처리했다으로이 방법은 불쾌한 성장 ... =>질문 1

나는이 문제를 desining 할 때 사용하는 보편적 인 패턴이 있는지 알고 싶습니다

.. 에게 나는 것 이 문제의 모든 부분에 대한 의견을 보내 주시면 감사하겠습니다.

나를 위해
+0

웹 서비스를 처리하기위한 멋진 구조를 만들려면이 블로그 게시물을 확인하십시오. 나는 지금 두 개의 큰 프로젝트에서 그것을 사용했고 ** ** 매우 좋았습니다 : http://commandshift.co.uk/blog/2014/01/02/nice-web-services/ – liamnichols

+0

" 알림 방법 "- 이것은 매우 일반적인 iOS 프로그래밍 결정입니다 - 다양한 방법이 있습니다! 종종 KVO는 훌륭하게 작동합니다. 종종 통지 센터. 가장 가능성있는 것은 상태 머신입니다. 앱에 이미 "주"싱글 톤이 있습니다. 하나의 호출 인 [STATE newFeedDataIsReady]를 호출하면됩니다. 그런 다음 IN 상태에서 앱을 기반으로 할 일을 결정할 수 있습니다.당신이 KVO를 시도하지 않았다면, 그것으로 실험 해보십시오. – Fattie

+0

예. 감사합니다, @liamnichols - 아주 좋은 블로그 게시물 및 프로젝트. – pothf

답변

1

유일한 진짜 답 또는 나는이 까다로운 문제를 줄 수있는 방향은 다음과 같습니다 @liamnichols이

  • 을 지적으로 꼭

    • 는 추상 클래스 -like 패턴의 일종을 사용 이 새로운 iOS를 읽는다면, "after ..."블록 패턴을 사용하는 것이 절대적으로 중요합니다 (아래 코드의 예)

    • 여기에 iOS/objective-C의 절대적으로 중요한 점이 있습니다 https://stackoverflow.com/a/20760583/294884 .. 블록 속성을 만드는 방법

    • 순수하게 IMO, 나는 정말로 "15 항목"이 실제로 정말로 합리화 될 수있는 큰 프로젝트를 찾지 못했습니다. 그것은 아직 일어나지 않았습니다. 그래서 우리가 조심스럽게 - 적어도 - 그것을 포장하여 (일방적으로 또는 다른 방식으로) 당신이 "15 항목"이라고 부르는 것. CLOUD.NOTES .. CLOUD.PROFILE .. CLOUD.SCORES .. 그리고 나머지 코드에서도 마찬가지입니다.

    • 사용이 너무 터무니 쉽다는 것을 네트워킹 시스템

    • 은주의하는 것이 매우 중요합니다에 대한 KVO와 NSNotifications 모두 얻을 것이 중요합니다

    • 네트워킹 시스템을위한 물론 싱글 (들) iOS 우주에서 JSON을 다루기 위해, 요즘에는 ("다행스럽게도"15 개의 개별 파일 "을 가지고 있습니다.) (일방적 또는 다른 방식으로) 정말 나쁜 것이 아니며, 실제로 가장 확실한 것으로 보일 것입니다 당신이 할 수있는 합리화.

    그래서 몇 가지 혼합 된 생각. 마지막으로 한 점 - 모든 것이 단지 입니다. 따라서 parse.com으로 이동하면이 모든 것이 의문이 생깁니다.

    "나는 아직까지는 bAAs로 옮긴 고객과 함께 일하고 있습니다. 아니, 정말로! ') 어떻게 네트워킹 코드를 깔끔하게 유지해야합니까?! " ㅎ.


    멋진 싱글 쓰기 쉬울 수 없습니다.

    필요한 모든 앱에 놓습니다.

    요즘에는 iOS에서 JSON을 처리하는 것이 믿기지 않을 정도로 간단합니다. 그래서, 제가 설명하는 것은 종종 사소한 것입니다. 코드는 수십 줄에 불과합니다.

    당신의 "클라우드"파일에는이 간단한 루틴이 들어있을 것입니다 ...이 싱글 톤은 "BLANKS"또는 이와 비슷한 것으로 ... 서버에서 "빈"사용자 파일 형식을 얻습니다.

    -(void)loadIfNeededThen:(void(^)(void))after 
        { 
        if (self.rawStubsFromCloud != nil) 
         { 
         NSLog(@"good new, blanks are already loaded!!"); 
         after(); 
         return; 
         } 
    
        [APP huddie]; // (use MBProgressHUD for all spinners) 
        APP.hud.labelText = @"Loading file blanks from cloud..."; 
    
        dispatch_after_secs_on_main(0.1 , 
          ^{ 
          [self _refreshThen: 
           ^{ 
           [APP.hud hide:YES]; 
    
           NSLog(@"loaded the blanks fine:\n%@\n", 
            [self supplyDisplayStyleString]); 
    
           after(); 
           }]; 
          } 
         ); 
        } 
    -(void)_refresh 
        { 
        [self _refreshThen:nil]; 
        } 
    
    #define uBlanks [NSURL URLWithString:@"http://blah.com/json/blanks"] 
    -(void)_refreshThen:(void(^)(void))after 
        { 
        dispatch_async(dispatch_get_main_queue(), 
         ^{ 
         self.rawBlanksFromCloud = [NSData dataWithContentsOfURL:uBlanks]; 
    
         [self _doShowAllOnLog]; 
    
         after(); 
         }); 
        } 
    

    그것은 그 실현 가치, 모든 는 Parse.com 및 기타 BAAS로 이동합니다. 다른 현실적인 미래는 없으며, 올해 말에 "서버 측"이 될 것은별로 없습니다.

    실제로이 단순 싱글 톤은 훨씬 간단 해졌습니다. 단지 Parse에 연결하는 몇 줄의 코드 일뿐입니다. 즐겨!

    그래서 TBC 위의 코드 샘플은 "예 오래 된 웹 서버"상황입니다. 여기

    은 ... "사용자 파일"을 가져 오는 예 .. (나는 그것을 할 수있는 정말 깔끔한 방법을 찾은 적이 .. 저주 URL을 호출 조립의 편리 일상 postStringUser주의!)의

    -(NSString *)postStringUser:(NSString *)user pass:(NSString *)pass 
    { 
    NSString *username = user; 
    NSString *password = pass; 
    
    NSMutableString *r = [NSMutableString stringWithString:@""]; 
    
    [r appendString:@"command=commandExampleGetFile"]; 
    [r appendString:@"&"]; 
    
    [r appendString:@"name=blah"]; 
    [r appendString:@"&"]; 
    
    [r appendString:@"user="]; 
    [r appendString: [username stringByUrlEncoding] ]; 
    [r appendString:@"&"]; 
    
    [r appendString:@"password="]; 
    [r appendString: [password stringByUrlEncoding] ]; 
    
    return r; 
    } 
    
    #define yourUrl [NSURL URLWithString:@"http://blah.com/json/blah"] 
    
    -(void)fetchTheUsersFiles:(NSString *)user pass:(NSString *)pass then:(void(^)(void))after 
    { 
    NSString *postString = [self postStringUser:user pass:pass]; 
    NSLog(@"postString is %@ ", postString); 
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:yourUrl]; 
    request.HTTPMethod = @"POST"; 
    request.HTTPBody = [ postString dataUsingEncoding:NSUTF8StringEncoding]; 
    [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField: @"Content-Type"]; 
    
    [APP huddie]; // use MBProgress everywhere and always at all times in all apps always 
    APP.hud.labelText = @"Connecting to the cloud..."; 
    
    // 1 get the data 
    // 2 make it a jdic 
    // 3 make it an array of the "files" 
    
    [NSURLConnection 
        sendAsynchronousRequest: request 
        queue: [NSOperationQueue mainQueue] 
        completionHandler:^(NSURLResponse *r, NSData *data, NSError *error) 
        { 
        [APP.hud hide:YES]; 
        NSLog(@"Done... %@", r); 
    
        self.rawGetFilesFromCloud = data; 
    
        NSError* err; 
        NSDictionary* jdic = [NSJSONSerialization 
         JSONObjectWithData:self.rawGetFilesFromCloud 
         options:kNilOptions 
         error:&err]; 
    
         //dev only 
         NSLog(@"Here's the whole damned jdic, for GetFiles\n%@", jdic); 
    
        if (! jdic) 
         { 
         [APP simpleOK:@"Wrong username or pass? Or no files found."]; 
         } 
        else 
         { 
         // the user has "logged in" so something like 
         STATE.currentUsername = user; 
         STATE.currentPassword = pass; 
         // naturally you have a STATE singleton, every app needs one 
    
         self.rawArrayFromCloud = [jdic objectForKey:@"data"]; 
    
         NSInteger kUserFiles = self.rawArrayFromCloud.count; 
         NSString *sayString = [NSString stringWithFormat: 
         @"We found %lu files of yours on the damned cloud.", kUserFiles]; 
    
         /* 
         and for example... 
         STATE.fileZero = self.rawArrayFromCloud[0]; 
         or for example... 
         NSDictionary *oneStubDict = self.rawArrayFromCloud[17]; 
         NSString *subjectName = oneStubDict[@"subjectName"]; 
         NSString *mainBody = oneStubDict[@"mainBody"]; 
         NSString *authorField = oneStubDict[@"authorField"]; 
         */ 
    
         [APP simpleOK: sayString 
          then:^{ [STATE showFileInterface]; } ]; 
         } 
    
        if (after) after(); 
        }]; 
    
    } 
    

    참고 중요한 코드는 ...

    NSMutableURLRequest *request = ... 
    
    [NSURLConnection sendAsynchronousRequest: request ... 
    
    NSDictionary* jdic = [NSJSONSerialization JSONObjectWithData:result ... 
    
    NSArray *theFiles = [jdic objectForKey:@"theFiles"]; 
    
    NSString *aField = theFiles[13]["coverInfo"]["aField"]; 
    

    희망은 도움보다는 조금 더!

  • +0

    답장을 보내 주셔서 감사합니다. @ JoeBlow. 나는 그것이 옳은지 잘 모르겠다. "공유 객체 apiComm"이 싱글 톤이었습니다. 내 문제는 POST 요청을 구성하는 것이 아니라 다양한 요청 집합을 효율적으로 구조화하는 것이 었습니다. 앱 개발이 끝날 때, _- (NSString *) postStringUser : (NSString *) 사용자 패스 : (NSString *) pass_ (CRUD 사용자 및 CRUD 자신의 이벤트 등)와 같은 10 가지 이상의 메소드가 있었고, 더 큰 앱으로 그렇게하는 것을 상상해보십시오. 하지만 고맙습니다. 나는 공포의 창조를 좋아합니다. – pothf

    +0

    흠, 나는 당신이 무엇을 요구하고 있는지 완전히 확신하지 못합니다 - 만약 당신이 "postStringUser"라는 방법을 보았다면 ... "당신은 15 명을 다루는 데 지긋합니다. ".. 그런 상황 이니? – Fattie

    +0

    나는 upvote하고 싶다. 그러나 나는 아직 충분한 평판을 가지고 있지 않다. .. 그리고 긍정, thats 상황. API와의 풍부한 커뮤니케이션을 통해 앱을 만들 때 따라갈 수있는 패턴이 있는지 궁금합니다. – pothf