developerWorks에서는 오늘날 많은 의사 소통 및 컨텐츠 교류가 모바일 장치를 통해 이루어지고 있고 특히, Apple iPhone이 전세계적으로 많은 인기를 얻고 있다는 것을 알고 있다. 또한 My developerWorks 커뮤니티의 기반이 되는 제품인 IBM Lotus® Connections 2.5는 가장 유명한 모바일 소셜 네트워킹 애플리케이션 중 일부를 에뮬레이트하는 최적의 사용자 환경을 제공한다.
developerWorks iPhone 애플리케이션은 다음과 같은 Lotus Connections의 여러 유명한 소셜 네트워킹 기능을 제공한다.
- 커뮤니티의 모든 활동을 볼 수 있고, 태그, 키워드 또는 사용자 이름으로 검색하여 My developerWorks 컨텐츠 및 사용자를 찾아볼 수 있는 공용 업데이트 보기
- "My updates"를 지속적으로 유지하거나, 상태 업데이트를 프로파일에 게시하거나 동료의 프로파일에 의견을 추가하는 기능
이러한 모든 기능은 Lotus Connections 2.5 공용 API를 사용하여 구현되었다.
Lotus Connections 2.5 API의 사용법을 소개하기 위해 이 기사에서는 My developerWorks의 최신 블로그 항목을 표시하는 간단한 iPhone 애플리케이션을 작성하는 단계를 살펴본다. 이 프로세스를 수행하려면 블로그 API에 액세스하고, 피드의 데이터를 다운로드하고, 데이터를 구문 분석하고, 데이터를 iPhone에 올바르게 표시하는 방법을 이해해야 한다.
Lotus Connections 2.5 API 살펴보기
Lotus Connections는 다양한 개발 작업에 사용할 수 있는 뛰어난 공용 API(Application Programming Interface) 세트를 제공한다. 이 API를 개발 작업에 활용하는 방법을 이해하려면 먼저 API 문서를 탐색하는 방법을 이해해야 한다.
Lotus Connections 애플리케이션(Activities, Blogs, Bookmarks, Communities, Files, Profiles 및 Wikis) 및 Lotus Connections 홈 페이지에서는 모두 iPhone 애플리케이션 등의 다른 애플리케이션과 통합하는 데 사용할 수 있는 API를 제공한다. 이 API를 사용하면 Lotus Connections 커뮤니티 스위트에 표시된 것과 동일한 데이터(예: My developerWorks의 모든 커뮤니티 활동)를 프로그래밍 방식으로 액세스하고 활용할 수 있다. Lotus Connections API는 양방향 통신(읽기/쓰기)을 지원하는 Atom Syndication Format을 기반으로 한다. 이 API는 HTTP를 통해 XML을 보내고 받을 수 있는 모든 프로그래밍 언어에서 사용할 수 있다.
Lotus Connections API 문서는 Lotus Connections Information Center에 있다. 이 기사에서 다루는 iPhone 애플리케이션의 목적이 진행 중인 사용자 업데이트를 커뮤니티에 게시하는 것이므로 "Getting a feed of all our public updates"라는 문서를 찾았다. 이 문서를 통해 알게 된 Updates API를 사용하면 My developerWorks의 사용자가 생성한 최신 공용 활동을 가져올 수 있다. Blog 예제에서도 동일한 Updates API를 참조한다. 이러한 API를 찾으려면 Developing - Lotus Connections APIs - Updates API - Getting updates feeds - Getting a feed of all public updates로 이동한다.
이제 피드를 사용하여 애플리케이션에 필요한 피드를 가져오는 방법을 이해하는 것이 중요하다.
표 1에서는 API의 내용을 가져오는 데 사용할 수 있는 자원을 설명한다. 자원은 API 내의 URL로 데이터에 액세스하는 데 사용된다. 이 자원은 Lotus Connections 내의 모든 공용 업데이트에 대한 루트 URL을 제공한다.
표 1. Atom API 요청 세부사항
| 자원 | 설명 |
|---|---|
| /atom/stories/public | 모든 공용 업데이트에 대한 피드를 가져온다. |
이 URL은 모든 공용 업데이트를 검색한다. 이 예제에서는 Blogs라는 하나의 애플리케이션에만 관심이 있으므로 이 애플리케이션만 피드로 리턴하면 된다.
표 2에서는 Blogs 애플리케이션을 식별하는 경우와 같이 애플리케이션에서 필터링하여 원하는 내용을 검색하는 데 사용할 수 있는 매개변수를 설명한다.
표 2. Lotus Connections 피드를 필터링하는 데 사용되는 매개변수
| 매개변수 | 설명 |
|---|---|
| before | 이 매개변수에 지정된 날짜 이전에 마지막으로 수정된 항목만 리턴한다. 2008-02-07T21:07:56Z 구문을 사용하여 날짜의 형식을 지정한다. |
| container | 다음 항목 중 하나의 고유 ID이다.
이 매개변수는 source 매개변수와 함께 사용된다. source 매개변수에서 항목의 고유 ID에 적합한 애플리케이션을 지정한다. 이 매개변수는 source 매개변수에 올바른 애플리케이션 이름이 지정되어 있지 않을 경우 무시된다. |
| 개인의 이메일 주소이다. 이 매개변수를 사용하여 특정 개인이 생성한 업데이트만 포함하도록 업데이트 피드를 제한한다. Lotus Connections가 모든 이메일 주소를 숨기도록 구성된 경우에는 이 매개변수를 사용하면 안 된다. 대신 사용자 ID를 사용한다. | |
| lang | 이 매개변수는 HTTP 요청에 지정된 언어 이외의 언어로 된 스토리를 요청할 때 사용한다. 언어를
지정하려면 다음 형식 중 하나를 사용한다.
|
| page | 페이지 번호이다. 리턴할 페이지를 지정한다. 기본값은 1이다. |
| ps | 페이지 크기이다. 페이지당 리턴할 항목의 수를 지정한다. 허용되는 최대값은 100이다. |
| since | 이 매개변수에 지정된 날짜 이후에 마지막으로 수정된 항목만 리턴한다. 2008-02-07T21:07:56Z 구문을 사용하여 날짜의 형식을 지정한다. |
| source | 업데이트 피드를 리턴할 단일 애플리케이션을 지정한다. 옵션은 다음과 같다.
|
| userid | 개인의 사용자 ID이다. 이 매개변수를 사용하여 특정 개인이 생성한 업데이트만 포함하도록 업데이트 피드를 제한한다. 이 매개변수와 mail 매개변수가 함께 지정된 경우에는 이 매개변수의 값이 우선적으로 적용된다. |
이 기사에서는 기본 설정인 20개의 항목 대신 30개의 최신 블로그 업데이트에 관심이 있으므로 페이지
크기 매개변수(ps)를 사용하여 이 사항을 지정한다.
30개의 최신 블로그 업데이트를 보기 위한 피드는 다음과 같다.
https://www.ibm.com/developerworks/mydeveloperworks/news/atom/stories/public?source=blogs&ps=30
일반적으로 사용되는 다른 매개변수로는 language, since
및 userid가 있다. 언어 유형 리턴 매개변수는 사용자 제공 내용을 변환하지
않는 대신 해당 내용과 연관된 표준 레이블 또는 UI를 변환한다는 점에 유의해야 한다. before
및 since 매개변수를 사용하면 시간 소인을 적용하여 특정 날짜 이전 또는 이후에
발생한 업데이트만 검색하도록 데이터를 제한할 수 있다. Userid를 사용하면 특정 사용자에 의해 생성된 내용만 업데이트하도록
제한할 수 있다.
여기에서는 샘플 애플리케이션이기 때문에 단일 피드만 보여 주고 있지만 My developerWorks iPhone 애플리케이션에서는 Lotus Connections API를 사용하여 애플리케이션, 검색 결과, 프로파일 데이터 등을 기준으로 필터링된 모든 사용자 제공 내용을 표시한다.
Lotus Connections API를 사용하여 애플리케이션 데이터를 가져오고 구문 분석하기
지금까지 API를 사용하여 Lotus Connections 데이터에 액세스하는 방법을 살펴보았으므로 이제부터는 iPhone 애플리케이션을 작성할 차례이다. 여기에서는 Apple xCode 템플리트 생성기를 사용하여 보기 기반 애플리케이션 iPhone 프로젝트인 SampleApplication을 작성한다(그림 1 참조).
그림 1. New xCode Project 창
프로젝트를 시작하면 SampleApplicationViewController.h 및 SampleApplicationViewController.m 파일을 포함한 여러 파일이 자동으로 작성된다. SampleapplicationViewController.m 파일에는 viewDidLoad 메소드가 있다. 이 메소드는 보기가 애플리케이션에 로드될 때 호출된다. Lotus Connections API 피드에 대한 연결 요청을 viewDidLoad 메소드에 추가하면 보기가 로드되고 사용자가 애플리케이션을 시작할 때 API에 대한 요청이 시작된다. API를 사용하려면 먼저 NSURLRequest를 정의한 후 여기에 첫 번째 섹션에서 가져왔던 ATOM 피드의 URL을 추가한다.
NSURLRequest 오브젝트가 작성되면 NSURLConnection을 작성하여 NSURLRequest에 전달한 후 위임자를 지정한다. NSURLConnection은 Atom API를 통해 iPhone 애플리케이션과 Lotus Connections가 통신하는 데 사용되는 단순한 인터페이스이다. NSURLConnection을 사용하여 연결을 작성하는 것은 간단하다. 애플리케이션에서 다음과 같은 메소드를 구현한 위임자 오브젝트를 제공하면 된다.
- connection:didReceiveResponse:
- connection:didReceiveData:
- connection:didFailWithError:
- connectionDidFinishLoading:
NSURLConnection은 요청을 비동기적으로 로드하고 NSURLConnection에서 리턴된 NSData로 수행할 작업을 알아야 하므로 이 기사에서는 NSURLConnection에 위임자를 지정한다.
다음 단계로 넘어가기 전에 먼저 Apple 개발자 안내서에 따라 위임자 오브젝트를 정의하자. 위임자 오브젝트 또는 위임은 프로그램의 한 오브젝트가 다른 오브젝트를 대신해서 또는 다른 오브젝트와 함께 수행하는 단순하고 강력한 패턴이다. 위임하는 오브젝트는 다른 오브젝트인 위임자에 대한 참조를 유지하면서 적절한 시간에 위임자에게 메시지를 보낸다. 이 메시지는 이벤트의 위임자에게 위임하는 오브젝트가 이벤트를 처리할 준비가 되었거나 처리를 완료했음을 알려 준다. 이 경우 NSURLConnection에서 데이터가 리턴되면 메시지가 위임자 오브젝트를 호출하여 사용자에게 표시할 수 있도록 데이터를 구문 분석할 준비가 완료되었다고 알려 준다.
목록 1에서는 샘플 애플리케이션에서 NSURLRequest 연결을 초기화하는 데 사용되는 코드를 보여 준다. 연결이 성공적으로 설정되면 networkActivityIndicatorVisible을 YES로 설정한다. 이 설정은 네트워크 활동의 진행 상황을 보여 주는 비주얼 표시기를 iPhone UI에 표시한다.
목록 1. NSURLRequest 작성하기
//Blogs Atom feed API
NSURL *url = [[[NSURL alloc]
initWithString:@"https://www.ibm.com/developerworks/mydeveloperworks/news/
atom/stories/public?source=blogs&ps=30"]
autorelease];
NSURLRequest* request = [[NSURLRequest alloc]
initWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self];
if (connection) {
//conection is good turn on the network indicator spinner
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
} else {
//error
}
|
다음으로 연결이 응답할 때 호출되는 메소드를 정의한다. 이 메소드에서는 응답 오브젝트의 헤더에 있는 Content-Length를 가져온다. 이 값은 NSMutableData 오브젝트의 크기를 정의하는 데 사용되며, 이 오브젝트에는 요청에 대한 모든 응답 데이터가 저장된다. 목록 2를 참조한다.
목록 2. NSURLConnection 응답 처리하기
////////////////////////////////////////////////////////////////////////////////////
- (void)connection:(NSURLConnection*)connection didReceiveResponse:
(NSHTTPURLResponse*)response {
//response saved so that status Codes can be checked later
_response = [response retain];
NSDictionary* headers = [response allHeaderFields];
int contentLength = [[headers objectForKey:@"Content-Length"] intValue];
//append the responseData used in connectionDidFinishLoading:
_responseData = [[NSMutableData alloc] initWithCapacity:contentLength];}
|
연결을 통해 데이터가 수신되면 모든 데이터를 responseData 오브젝트에 추가한다. 이 메소드는 두 번 이상 호출될 수 있다. 바로 이 때문에 데이터를 설정하지 않고 추가하는 것이다. 목록 3을 참조한다.
목록 3. 모든 응답 데이터 추가하기
////////////////////////////////////////////////////////////////////////////////////
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
[_responseData appendData:data];
}
|
연결을 통한 로드가 완료되면 위임자 오브젝트 메소드인 connectionDidFinishLoading이 호출된다. 이제 요청에 대한 응답 데이터가 모두 리턴되었으므로 이 데이터를 구문 분석기에 보내서 업데이트 피드에 있는 블로그 항목 제목을 가져온다.
이제 서버의 데이터가 수신되었으므로 요청도 완료되었다. 따라서 네트워크 활동 표시기도 해제할 수 있다(목록 4 참조).
목록 4. 구문 분석기 작성 후 구문 분석할 데이터 전달하기
////////////////////////////////////////////////////////////////////////////////////
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
AtomParser *parser = [[AtomParser alloc] initWithData:_responseData];
[parser parse];
_items = parser.items;
[_tableView reloadData];
}
|
마지막으로 Atom 피드를 구문 분석하는 클래스를 작성할 차례이다. 먼저 XCode 프로젝트에서 Objective-C 클래스를 작성한다. 여기에서는 Atom 피드 구문 분석기에 AtomParser.m과 AtomParser.h라는 이름을 지정했다. 그런 다음 AtomParser.h가 NSXMLParserDelegate 프로토콜을 구현한 NSXMLParser의 서브클래스가 되도록 이 구문 분석기를 변경한다. 이 단계는 AtomParser.h에서 수행되며 다음과 같다.
@interface AtomParser : NSXMLParser <NSXMLParserDelegate>
이제 AtomParser 클래스를 작성했으므로 목록 5에서 호출되는 parse 메소드를 작성해야 하며, 목록 5는 AtomParser.m의 parse 메소드에 포함된 코드이다.
목록 5. NSXMLParser 호출하기
- (BOOL)parse {
_items = [[NSMutableArray alloc] init];
self.delegate = self;
BOOL result = [super parse];
return result;
}
|
이제 항목 배열을 초기화해야 한다. 이 배열에는 tableView에 표시하기 위해 SampleApplicationViewController.m에게 다시 전달할 모든 정보가 저장된다. 위임자를 self로 설정한다. 이는 NSXMLParserDelegate 메소드를 다음과 같이 직접 정의해야 한다는 것을 의미한다.
- elements: parser:didStartElement:namespaceURI:qualifiedName:attributes:
- parser:foundCharacters:
- parser:didEndElement:namespaceURI:qualifiedNames:
그런 다음 AtomParser 클래스의 상속된 수퍼클래스를 호출하여 Lotus Connections API에서 리턴된 데이터에 대한 구문 분석을 실행한다. 데이터가 구문 분석되면 위임자 메소드가 호출된다. 이 단계에서는 사용자가 무시할 데이터와 항목 배열에 저장할 데이터를 결정한다. 샘플 애플리케이션에서는 <entry> 태그 내의 title 요소에만 관심이 있다. 나중에 이 정보를 UITableView에 표시하는 방법에 대해 살펴본다.
NSXMLParser 메소드 parse는 실행된 후 먼저 메소드의 위임자 구현인
parser:didStartElement:namespaceURI:qualifiedName:attributes:를 호출한다. 이 메소드는 요소 이름을
찾은 다음 <title> 요소를 검색한다. title 요소가 있으면 문자열 내용을 <title> 요소에
저장할 수 있다는 의미로 BOOL _foundTitle을 YES로 설정한다. 이 예제에서는 검색한 API 데이터 중 마지막
30개 블로그 항목의 제목을 tableView에 모두 표시하므로 <title> 요소를 사용한다. 목록 6에서는
elementName이 title;bif와 동일한지 여부를 확인하는 방법을 보여 준다. 따라서 foundEntry BOOL을 적절히
설정한다. 문자열 "entry"에 대한 elementName을 검사하여 "title"이라는 이름이 지정된 Atom 피드의 모든
태그가 <entry> 태그의 하위 항목인지 확인한다. 이 경우에는 <entry> 요소의 하위 항목인 <title>
요소만 필요하다. API에서 리턴된 전체 Atom 피드를 보면 Atom 피드의 제목을 정의하는 <title> 요소가
있다는 것도 알 수 있다. 이 <title> 요소는 <entry> 요소의 하위 항목이 아니다. 따라서 이 예제에서는 이 요소를 무시한다.
목록 6. elementName 검사하기
////////////////////////////////////////////////////////////////////////////////////
- (void) parser: (NSXMLParser*) parser
didStartElement: (NSString*) elementName
namespaceURI: (NSString*) namespaceURI
qualifiedName: (NSString*) qName
attributes: (NSDictionary*)attributeDict {
if ([elementName isEqualToString:@"entry"]) {
_foundEntry = YES;
}
if ([elementName isEqualToString:@"title"]) {
_foundTitle = YES;
_title = [[NSMutableString alloc] init];
}
}
|
구문 분석 프로세스에서 다음으로 호출되는 메소드는 parser:foundCharacters:이다. 이 메소드는 현재 요소에 있는 문자열 내용의 전체 또는 일부를 제공한다. 모든 문자열 내용이 처음에 호출된다는 보장이 없기 때문에 NSMutableString _title 오브젝트는 마지막 메소드가 호출될 때까지 현재 문자열을 추가한다.
parser:didEndElement:namespaceURI:qualifiedNames:
목록 7. title 요소의 텍스트 값 저장하기
////////////////////////////////////////////////////////////////////////////////////
- (void) parser: (NSXMLParser*) parser
foundCharacters: (NSString*) string {
if (_foundTitle '&& _foundEntry) {
[_title appendString:string];
}
}
|
NSXMLParserDelegate의 위임자로 호출되는 마지막 메소드는 parser:didEndElement:namespaceURI: qualifiedName:이다. 이 메소드는 elementName이 "title"과 동일하고 _foundEntry BOOL이 YES로 설정되었는지 검사한다. elementName이 "title"이고 _foundEntry가 true이면 전체 제목 태그가 구문 분석된 것이므로 <title> 요소의 내용에 대한 문자열 값을 항목 배열에 저장한다. 이 단계는 <entry> 요소의 하위 항목인 <title> 요소의 끝에 도달했음을 의미한다. 요소의 끝에 도달했으면 <title> 요소의 내용에 대한 문자열 값을 항목 배열에 저장한다. 이 예제에서는 문자열 값을 _title에 저장했다(목록 7 참조). 제목 문자열을 항목 배열에 추가한 후에는 다음 제목이 이전 제목에 추가되지 않도록 제목 문자열 오브젝트를 해제한다. elementName이 "entry"이면 foundEntry를 NO로 설정한다. 다시 말해서 구문 분석기에서 이름이 "title"인 요소가 검색된 경우에는 해당 요소가 <entry> 요소의 하위 항목이 아니므로 이 예제의 다른 모든 요소 이름이 무시된다.
목록 8. title 요소 텍스트 값 저장하기
////////////////////////////////////////////////////////////////////////////////////
- (void) parser: (NSXMLParser*) parser
didEndElement: (NSString*) elementName
namespaceURI: (NSString*) namespaceURI
qualifiedName: (NSString*) qName {
if ([elementName isEqualToString:@"title"] && _foundEntry) {
_foundTitle = NO;
[_items addObject:_title];
[_title release];
}
if ([elementName isEqualToString:@"entry"]) {
_foundEntry = NO;
}
}
|
마지막으로 사용자에게 보여 주고 싶은 모습으로 iPhone에 표시할 데이터를 준비할 차례이다.
구문 분석이 완료되었으므로 이제 NSString 항목 배열을 테이블 형태로 표시할 수 있다. 테이블 보기를 작성하려면 항목 배열 호출 [_tableView reloadData]의 테이블 데이터를 로드한다(목록 4 참조). 이 코드는 테이블 보기 위임자 메소드인 tableView:cellForRowAtIndexPath:를 호출한다. SampleApplicationViewController.m이 tableView 위임자이므로 해당 클래스에 정의된 메소드를 호출한다. viewDidLoad 메소드의 아래쪽에서 설정되는 tableView 위임자 및 데이터 소스를 볼 수 있다. 이 코드는 NSURLRequest 및 NSURLConnection 코드 바로 위에 삽입된다.
목록 9. viewDidLoad 구현하기
// Implement viewDidLoad to do additional setup after
loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
_tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease];
[self.view addSubview:_tableView];
_tableView.delegate = self;
_tableView.dataSource = self;
//Blogs Atom feed API
NSURL *url = [[[NSURL alloc]
initWithString:@"https://www.ibm.com/developerworks/mydeveloperworks/news/atom/
stories/public?source=blogs&ps=30"]
autorelease];
NSURLRequest* request = [[NSURLRequest alloc]
initWithURL:url];
|
UITableView가 로드되는 동안 화면에 표시할 수 있는 테이블 셀의 수만큼 tableView:cellForRowAtIndexPath:가 호출된다. 예를 들어, 화면의 높이가 100픽셀이고 각 테이블 셀의 높이가 10픽셀이면 이 메소드가 10번 호출된다. 이 메소드는 TableViewCell 클래스 인스턴스를 리턴한다. 이 인스턴스는 테이블에 표시되는 데이터의 레이아웃이다. 사용자가 테이블을 스크롤하면 화면에 테이블 셀이 표시될 때마다 tableView:cellForRowAtIndexPath:가 호출된다. UiTableView는 이 메소드를 호출할 때마다 리턴되기를 바라는 UITableViewCell의 값인 indexPath를 전달한다. 샘플 애플리케이션에서는 UITableViewCell의 textLabel에 설정된 블로그 항목의 제목과 함께 UITableViewCell을 다시 전달한다.
목록 10. UITableViewCell 작성하기
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)
indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier] autorelease];
NSString* title = [[NSString alloc] initWithString:[_items
objectAtIndex:indexPath.row]];
cell.textLabel.font = [UIFont systemFontOfSize:12];
cell.textLabel.text = title;
}
// Configure the cell...
return cell;
}
|
마지막으로 UiTableView에서는 테이블에 표시할 행의 수를 알아야 한다. 항목 배열에 있는 테이블의 행 수만 표시하면 된다. API 호출에서 30개의 항목을 요청했으므로 항목 배열 크기는 30이다. 다시 한번 말하지만 테이블 보기 데이터 소스 클래스는 tableView: numberOfRowsInSection:을 구현한다. 이 메소드는 항목 배열의 크기를 바탕으로 tableView의 크기를 리턴한다(이 경우에는 30).
목록 11. UITableView의 행 및 섹션 수 가져오기
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)
section {
return [_items count];
}
|
샘플 애플리케이션에는 My developerWorks 애플리케이션에서 사용자가 UITableViewCell을 선택할 때 표시되는 세부사항 보기가 포함되어 있지 않다. 하지만 이 태스크는 tableView:didSelectRowAtIndexPath:를 구현하여 수행할 수 있다. 이 메소드에서 다른 UIViewController를 초기화한 다음 애플리케이션을 해당 보기로 이동시켜서 좀 더 자세한 UITableViewCell 보기를 표시할 수 있다.
드디어 샘플 iPhone 애플리케이션이 완성되었다. 이 애플리케이션은 Lotus Connections의 최신 30개의 블로그 항목을 표시장치에 표시한다(그림 2 참조).
그림 2. Windows Picture and Fax Viewer
Lotus Connections Atom API를 사용하다 보면 애플리케이션에서 표시하는 내용에 따라 iPhone 애플리케이션의 성능을 최적화하기 위해 로컬 캐시 구현을 고려할 때가 있다. 다음은 이를 위해 고려할 사항이다.
- 애플리케이션에서 사용자의 프로파일과 같이 자주 업데이트되지 않는 데이터에 액세스하는 경우에는 캐싱을 구현해야 한다.
- 블로그 샘플 애플리케이션의 데이터와 같이 자주 업데이트되는 데이터를 가져오는 경우에는 캐싱을 사용하지 않는 것이 좋다. 왜냐하면 캐싱을 사용하면 최신 사용자 데이터가 표시되지 않기 때문이다.
캐싱은 여러 다양한 레벨에서 구현할 수 있다. 연결 요청에서 리턴된 NSMutableData에 결과를 캐싱할 수 있다. 이 방법을 사용하면 애플리케이션이 로드될 때마다 피드를 다운로드하지 않아도 된다. 애플리케이션에서는 여전히 데이터를 표시하기 전에 캐싱된 데이터를 구문 분석해야 한다.
또는 항목 배열에 있는 구문 분석된 데이터를 캐싱할 수도 있다. 이 구현을 사용하면 데이터를 표시하기 전에 피드를 다운로드하고 구문 분석하는 단계를 수행하지 않아도 된다.
항목 배열을 캐싱하려면 배열에 저장된 오브젝트가 NSCoding을 따라야 한다. 샘플 애플리케이션에서는 제목이 NSString 오브젝트로 항목 배열에 저장되기 때문에 애플리케이션에서 항목 배열을 디스크에 캐싱할 수 있다.
목록 12. 캐싱된 NSArray 항목 설정 및 가져오기
////////////////////////////////////////////////////////////////////////////////////
+(void)cacheItems:(NSArray*)items {
NSString *kFile = @"cachedArrayFile";
NSString *kArray = @"Array";
NSMutableData *theData;
NSKeyedArchiver *encoder;
theData = [NSMutableData data];
encoder = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:theData];
[encoder encodeObject:items forKey:kArray];
[encoder finishEncoding];
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory
stringByAppendingPathComponent:kFile];
[theData writeToFile:path atomically:YES];
[encoder release];
}
////////////////////////////////////////////////////////////////////////////////////
+(NSMutableArray *)getCachedItems {
NSString *kFile = @"cachedArrayFile";
NSString *kArray = @"Array";
NSMutableArray *tempArray = [NSMutableArray array];
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory
stringByAppendingPathComponent:kFile];
NSFileManager *fileManager = [NSFileManager defaultManager];
if([fileManager fileExistsAtPath:path]) {
//open it and read it
NSMutableData *decodeData;
NSKeyedUnarchiver *decoder;
decodeData = [NSData dataWithContentsOfFile:path];
decoder = [[NSKeyedUnarchiver alloc]
initForReadingWithData:decodeData];
tempArray = [decoder decodeObjectForKey:kArray];
[decoder finishDecoding];
[decoder release];
}
return tempArray;
}
|
Lotus Connections 2.5 API를 사용하여 iPhone용 애플리케이션을 작성하는 방법은 간단하다. Lotus Connections API를 탐색하는 방법에 대한 기본적인 이해가 있고 Lotus Connections Atom 피드에서 데이터를 가져와서 구문 분석한 후 애플리케이션에 표시하는 몇 가지 간단한 단계를 수행할 수만 있으면 원하는 결과를 얻을 수 있다. Lotus Connections 2.5 API의 모든 기능을 살펴보려면 Apple App Store에 있는 My developerWorks iPhone 애플리케이션을 사용해 보기 바란다.
| 이름 | 크기 | 다운로드 방식 |
|---|---|---|
| SampleApplication.zip | 39.5KB | HTTP |
교육
-
Lotus
Connections Information Center를 살펴보자.
-
My developerWorks가 처음이라면 소개 내용을 읽어보자.
-
My developerWorks: 기술 스킬 및 전문 네트워크를 구축하는 새로운 방법을 읽어보자.
-
Lotus Connections에 대해 자세히 알아보자.
제품 및 기술 얻기
-
Apple App Store에서 My developerWorks iPhone 애플리케이션을 다운로드할 수 있다.
토론
- 포럼에 참여하기.
-
My
developerWorks에 참여하자.
An advisory software engineer for IBM developerWorks, Nick Poore is the chief community architect for My developerWorks and has worked on assignment for the Lotus Connections 3.0 product delivery team. Nick combined his enthusiasm for the Apple iPhone with his knowledge of Lotus Connections to develop one of IBM’s first native iPhone applications. Learn more in Nick’s profile on My developerWorks: http://www.ibm.com/developerworks/mydeveloperworks/profiles/user/nickpoore

Ami Dewar is the developerWorks Advanced design team lead. Advanced design is a hybrid team of designers, developers, and architects working to keep developerWorks on the cutting edge. Ami, formerly the lead graphic designer, has been a designer with IBM for six years, creating over 1200 feature graphics and 8000 technical illustrations. Learn more in Ami's profile on My developerWorks: https://www.ibm.com/developerworks/mydeveloperworks/profiles/user/amidewar.