スクリーンレットでコネクタを作成して使用する
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、こちらまでご連絡ください。
Liferay Screensでは、コネクタはローカルおよびリモートのデータソースとLiferayインスタンスと非同期に対話するクラスです。 コールバックは非同期サービス呼び出しも行うことを思い出してください。 では、なぜコネクタに悩まされるのでしょうか? コネクタは、Interactorの外部でサービスを呼び出すことにより、抽象化の層を提供します。 たとえば、スクリーンレット作成チュートリアル のインタラクター
はサーバーを呼び出し、その結果を LRCallback
処理します。 代わりに、このスクリーンレットは別のコネクタクラスでサーバー呼び出しを行い、Interactorがコネクタをインスタンス化してその結果を受け取るようにすることができます。 コネクタを使用すると、スクリーンレットのデータを検証することもできます。 コネクタの詳細については、以下を参照してください iOS用のLiferay画面のアーキテクチャ上のチュートリアル。
このチュートリアルでは使用して、あなたのscreenletsでコネクタを作成して使用するために必要な手順を説明します サンプルの高度なバージョンがブックマークScreenlet追加 例として。 このスクリーンレットには2つのアクションが含まれています。
-
ブックマークの追加:Liferay DXPインストールのブックマークポートレットにブックマークを追加します。 このチュートリアルでは、このアクションのコネクタを作成して使用する方法を示します。
-
タイトルを取得:ユーザーが入力したブックマークURLからタイトルを取得します。 このチュートリアルでは、このアクションで既存のコネクターを使用する方法を示します。
先に進む前に、必ず読んで作る Screenlet作成チュートリアル。 最初に、コネクターの作成方法を学びます。
コネクタの作成
コネクタクラスを作成するときは、ベストプラクティスチュートリアルで指定されている 命名規則 に従ってください。
次の手順を使用して、Connectorクラスを実装します。
-
ServerConnector
クラス拡張して、Connectorクラスを作成します。 たとえば、Add Bookmark ScreenletのコネクタクラスAddBookmarkLiferayConnector
のクラス宣言は次のとおりです。public class AddBookmarkLiferayConnector: ServerConnector { ... }
-
Mobile SDKサービスの呼び出しに必要なプロパティを追加し、それらのプロパティを設定する初期化子を作成します。 たとえば、
AddBookmarkLiferayConnector
は、ブックマークのフォルダーID、タイトル、およびURLのプロパティが必要です。 これらのプロパティを設定するには、初期化子も必要です。public let folderId: Int64 public let title: String public let url: String public init(folderId: Int64, title: String, url: String) { self.folderId = folderId self.title = title self.url = url super.init() }
-
Screenletのプロパティのいずれかを検証する場合は、
validateData
メソッドをオーバーライドして、それらのプロパティの検証を実装します。ValidationError
クラス を使用して、エラーをカプセル化できます。 たとえば、次のAddBookmarkLiferayConnector
validateData
実装により、folderId
が0
超え、title
およびurl
に値が含まれることが保証されます。 このメソッドは、エラーを表すためにValidationError
も使用します。override public func validateData() -> ValidationError? { let error = super.validateData() if error == nil { if folderId <= 0 { return ValidationError("Undefined folderId") } if title.isEmpty { return ValidationError("Title cannot be empty") } if url.isEmpty { return ValidationError("URL cannot be empty") } } return error }
-
doRun
メソッドをオーバーライドして、呼び出す必要があるMobile SDKサービスを呼び出します。 このメソッドは、サービスから結果を取得し、パブリックプロパティに保存する必要があります。 また、エラーと空の結果を処理するようにしてください。 たとえば、次のコードは、doRun
メソッドで取得したサービスの結果を保存するためのresultBookmarkInfo
プロパティを定義します。 このメソッドのサービス呼び出しは、 スクリーンレット作成チュートリアルのAddBookmarkInteractor
クラスのstart
メソッドの呼び出しと同じであることに注意してください。 ただし、doRun
メソッドは、結果をresultBookmarkInfo
プロパティに保存する追加のステップを実行します。 また、このdoRun
メソッドは、エラーをNSError
オブジェクトとして処理することに注意してください。public var resultBookmarkInfo: [String:AnyObject]? override public func doRun(session session: LRSession) { let service = LRBookmarksEntryService_v7(session: session) do { let result = try service.addEntryWithGroupId(LiferayServerContext.groupId, folderId: folderId, name: title, url: url, description: "Added from Liferay Screens", serviceContext: nil) if let result = result as? [String: AnyObject] { resultBookmarkInfo = result lastError = nil } else { lastError = NSError.errorWithCause(.InvalidServerResponse) resultBookmarkInfo = nil } } catch let error as NSError { lastError = error resultBookmarkInfo = nil } }
よくやった\! これで、Connectorクラスを作成する方法がわかりました。 完成した例を見るには AddBookmarkLiferayConnector
クラス、 ここをクリック。
コネクタを使用する
コネクターを使用するには、Interactorクラスが ServerConnectorInteractor
クラス または以下のサブクラスのいずれかを拡張する必要があります。
-
ServerReadConnectorInteractor
: サーバーまたはデータソースから情報を取得するアクションを実装する場合、Interactorクラスはこのクラスを拡張する必要があります。 -
ServerWriteConnectorInteractor
: サーバーまたはデータソースに情報を書き込むアクションを実装する場合、Interactorクラスはこのクラスを拡張する必要があります。
ServerConnectorInteractor
またはそのサブクラスの1つを拡張する場合、Interactorクラスは createConnector
および completedConnector
メソッドをオーバーライドするだけで済みます。 これらのメソッドは、それぞれコネクタインスタンスを作成し、コネクタの結果を回復します。
Interactorでコネクタを使用するには、次の手順に従います。
-
Interactorクラスのスーパークラスを
ServerConnectorInteractor
またはそのサブクラスの1つに設定します。 また、コールバックプロトコルが存在する場合は、コールバックプロトコルに準拠するコードも削除する必要があります。 たとえば、ブックマークの追加スクリーンレットのInteractorクラス(AddBookmarkInteractor
)は、Liferay DXPインストールにデータを書き込むため、ServerWriteConnectorInteractor
拡張します。 この時点で、Interactorに必要なプロパティとイニシャライザーのみを含める必要があります。public class AddBookmarkInteractor: ServerWriteConnectorInteractor { public let folderId: Int64 public let title: String public let url: String public var resultBookmark: Bookmark? //MARK: Initializer public init(screenlet: BaseScreenlet, folderId: Int64, title: String, url: String) { self.folderId = folderId self.title = title self.url = url super.init(screenlet: screenlet) } }
-
createConnector
メソッドをオーバーライドして、コネクターのインスタンスを返します。 例えば、createConnector
における方法AddBookmarkInteractor
戻りAddBookmarkLiferayConnector
で作成されたインスタンスフォルダID
、タイトル
、及びURL
の特性:public override func createConnector() -> ServerConnector? { return AddBookmarkLiferayConnector(folderId: folderId, title: title, url: url) }
-
completedConnector
メソッドをオーバーライドして、Connectorから結果を取得し、適切なプロパティに保存します。 たとえば、AddBookmarkInteractor
のcompletedConnector
メソッドは、最初にServerConnector
引数をAddBookmarkLiferayConnector
キャストします。 次に、ConnectorのresultBookmarkInfo
プロパティを取得し、InteractorのresultBookmark
プロパティに設定します。override public func completedConnector(c: ServerConnector) { if let addCon = (c as? AddBookmarkLiferayConnector), bookmarkInfo = addCon.resultBookmarkInfo { self.resultBookmark = bookmarkInfo } }
それでおしまい\! 完全な例を参照するには AddBookmarkInteractor
、 こちらをクリックしてください。
スクリーンレットが複数のインタラクターを使用している場合は、同じ手順に従ってコネクターを使用します。 また、画面が提供する すぐに使用できる HTTPConnectorの
非LiferayのURLのと対話するため。 このコネクターを使用するには、Interactorを HttpConnector
を使用するように設定します。 たとえば、URLのタイトルを取得するブックマークスクリーンレットの追加アクションは、Liferay DXPインストールと対話しません。 URLから直接タイトルを取得します。 このアクションのInteractorクラス(GetWebTitleInteractor
)はデータを取得するため、 ServerReadConnectorInteractor
拡張します。 また、 createConnector
および completedConnector
メソッドをオーバーライドして、 HttpConnector
を使用します。 完全な GetWebTitleInteractor
次のとおりです。
import UIKit
import LiferayScreens
public class GetWebTitleInteractor: ServerReadConnectorInteractor {
public let url: String?
// title from the webpage
public var resultTitle: String?
//MARK: Initializer
public init(screenlet: BaseScreenlet, url: String) {
self.url = url
super.init(screenlet: screenlet)
}
//MARK: ServerConnectorInteractor
public override func createConnector() -> ServerConnector? {
if let url = url, URL = NSURL(string: url) {
return HttpConnector(url: URL)
}
return nil
}
override public func completedConnector(c: ServerConnector) {
if let httpCon = (c as? HttpConnector), data = httpCon.resultData,
html = NSString(data: data, encoding: NSUTF8StringEncoding) {
self.resultTitle = parseTitle(html)
}
}
//MARK: Private methods
// Parse the title from the webpage's HTML
private func parseTitle(html: NSString) -> String {
let range1 = html.rangeOfString("<title>")
let range2 = html.rangeOfString("</title>")
let start = range1.location + range1.length
return html.substringWithRange(NSMakeRange(start, range2.location - start))
}
}
驚くばかり\! これで、スクリーンレットでコネクタを作成および使用する方法がわかりました。