クラスの方法を参照する方法
-
21-12-2019 - |
質問
App.Netクライアントを書いていて、ADNのサーバーと通信するフレームワークとしてADNKitを使用しています。 zephyr 、app.netクライアントのオープンソースコードからいくつかのアイデアを得ました。オープンソースプロジェクトに。
POST(PostStreamViewController)のリストを表示するためのビューコントローラ(PostStreamViewController)Data ControllingオブジェクトとapiCallMaker
というプロパティを持つ設定オブジェクトを使用します。
このプロパティは次のように定義されています。
typedef void (^APIPostListCallback)(NSArray *posts, PostListMetadata *meta, NSError *error);
...
@property (nonatomic, copy) void (^apiCallMaker)(APIPostParameters *parameters, APIPostListCallback callback);
.
これにより、メインタイムライン、タイムラインなどに同じデータコントローラオブジェクトを再利用できます。これは、これらのPOSTストリームタイプのそれぞれの設定ファイルを提供します。これはそれぞれ異なるAPI呼び出しを参照します。
例えば、Post Streamの設定ファイルでは、self.apicallmakerを次のように定義します。
- (void (^)(APIPostParameters *parameters, APIPostListCallback callback))apiCallMaker
{
return [^(APIPostParameters *parameters, APIPostListCallback callback) {
[APIUserMentionStream getUserMentionStreamWithParameters:parameters userID:self.userID completionHandler:callback];
} copy];
}
.
これは長く巻き上げられていますが、私と一緒に貼り付けます。私はこの方法がかなりクールだと思った、それはより軽いデータコントローラオブジェクトと構成ファイルのために作りやすいものです。
私の実装では、代わりに私のapiCallMaker
をこのように宣言します。
// this is the default parameters returned by ANKClients post fetching methods
typedef void (^APIPostListCallback)(id responseObject, ANKAPIResponseMeta *meta, NSError *error);
...
@property (nonatomic, copy) void (^apiCallMaker)(ANKClient *client, APIPostListCallback callback);
.
私の構成ファイルでは、このようなapiCallMaker
を定義します。
- (void (^)(ANKClient *client, APIPostListCallback callback))apiCallMaker
{
return [^(ANKClient *client, APIPostListCallback callback) {
[client fetchPostsMentioningUser:self.user completion:callback];
} copy];
}
.
その後投稿を取得するとき、私はこれを行います:
ANKClient *client = ... // authenticated client object with parameters
self.apiCallMaker(clientCopy, ^(id responseObject, ANKAPIResponseMeta *meta, NSError *error){
if (!error) {
// handle data
} else {
// handle error
}
});
.
これに関する問題は、ANKJSONRequestOperation
を介して[client fetchPostsMentioningUser:self.user completion:callback];
を呼び出すときに、ankclientオブジェクトによって返されるapiCallMaker
への参照を保存できないことです。 View Controllerがポップ/割り当て解除されているときにネットワーク要求を簡単にキャンセルできるため、ANKJSONRequestOperation
への参照を保存します。
- (void)fetchPosts
{
ANKClient *client = ... // authenticated client object with parameters
self.requestOperation = [clientCopy fetchPostsMentioningUser:user completion:^(id responseObject, ANKAPIResponseMeta *meta, NSError *error) {
// handle posts/error
}];
}
...
- (void)dealloc {
...
[self.requestOperation cancel];
}
.
は、返されるfetchPostsMentioningUser:
を保存することができるように、クライアントオブジェクトを呼び出している間に呼び出す必要がある方法(ANKJSONRequestOperation
)に参照する方法がありますか?
更新
OK、@bergが提案したように、私のプロパティの戻り型を今ANKJSONRequestOperation *
にしました。
私は、構成ファイルのようなデータコントローラにもプロパティを持っていることを言及するのを忘れました。それは冗長なものですが、データコントローラを初期化するときは、そのApicallMakerを構成から1つ設定します。だからここでそれが今すぐレイアウトした方法は、テストのプロパティ名を変更しました。
問題は、私がself.fetcherを設定するたびに、NULL
です。構成ファイルがankjsonRequestOperationを返す方法を変更する必要があります。私の無知を許してください、ブロックは、多くの頭痛。
typedef void (^APIPostListCallback)(id responseObject, ANKAPIResponseMeta *meta, NSError *error);
@property (nonatomic, readonly) ANKJSONRequestOperation *(^fetcher)(ANKClient *client, APIPostListCallback callback);
.
configuration.m
- (ANKJSONRequestOperation *(^)(ANKClient *client, APIPostListCallback callback))fetcher
{
return [^(ANKClient *client, APIPostListCallback callback) {
[client fetchUnifiedStreamForCurrentUserWithCompletion:callback];
} copy];
}
.
datacontroller.h
@property (nonatomic, copy) ANKJSONRequestOperation *(^fetcher)(ANKClient *client, APIPostListCallback callback);
.
datacontroller.m
@property (nonatomic, strong) ANKJSONRequestOperation *operation;
- (id)initWithConfiguration:(Configuration *)configuration {
...
self.fetcher = configuration.fetcher
}
- (void)fetchPosts {
...
self.operation = self.fetcher(clientCopy, ^(id responseObject, ANKAPIResponseMeta *meta, NSError *error) {
if (!error) {
[self.data setPosts:responseObject meta:meta];
} else {
// handle error
}
});
}
. 解決
Configuration.MのプロパティGetterの実装は次のとおりです。
- (ANKJSONRequestOperation *(^)(ANKClient *client, APIPostListCallback callback))fetcher
{
return [^(ANKClient *client, APIPostListCallback callback) {
return [client fetchUnifiedStreamForCurrentUserWithCompletion:callback];
} copy];
}
. 他のヒント
はい。
SEL method = @selector(fetchPostsMentioningUser:);
.
それからあなたは電話をします:
[obj performSelector:method withObject:argument];
.