2

userInfo NSDictionaryを aにする方法はありNSOperationますか?

基本的に、ID を NSOperation に割り当てたいのですが、後でこの ID が NSOperation に既に割り当てられているかどうかを確認したいのです。

- (void)processSmthForID:(NSString *)someID {

    for (NSOperation * operation in self.precessQueue.operations) {

        if ([operation.userInfo[@"id"] isEqualToString:someID]) {
            // already doing this for this ID, no need to create another operation
            return;
        }

    }

    NSOperation * newOperation = ...
    newOperation.userInfo[@"id"] = someID;

    // enqueue and execute

}
4

2 に答える 2

6

NSOperationサブクラス化することを意図しています。独自のサブクラスを設計するだけです。

NSOperation クラスは、単一のタスクに関連付けられたコードとデータをカプセル化するために使用する抽象クラスです。抽象クラスであるため、このクラスを直接使用するのではなく、サブクラス化するか、システム定義のサブクラス (NSInvocationOperation または NSBlockOperation) のいずれかを使用して実際のタスクを実行します。

ここを読む

userInfoプロパティの追加については、@ Daij-Djan に同意します。
このプロパティは、拡張機能として実装できますNSOperation(実装については、彼の回答を参照してください)。
ただし、 の識別子の必要性NSOperationはクラスの特殊化です (新しいクラスは であると言えますIdentifiableOperation)

于 2013-04-27T11:13:06.250 に答える
1

次のように NSOperation のプロパティを定義します。

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

//category
@interface NSOperation (UserInfo)
@property(copy) NSDictionary *userInfo;
@end

static void * const kDDAssociatedStorageUserInfo = (void*)&kDDAssociatedStorageUserInfo;

@implementation NSOperation (UserInfo)

- (void)setUserInfo:(NSDictionary *)userInfo {
    objc_setAssociatedObject(self, kDDAssociatedStorageUserInfo, [userInfo copy], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSDictionary *)userInfo {
    return objc_getAssociatedObject(self, kDDAssociatedStorageUserInfo);
}

@end

thaat は、任意の NSOperation またはそのサブクラスで userInfo を取得します...たとえば、NSBlockOperation または AFHTTPRequestOperation

デモ:

    //AFNetwork test
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.de"]]];
    operation.userInfo = @{@"url":operation.request.URL};
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"download of %@ completed. userinfo is %@", operation.request.URL, operation.userInfo);
        if(queue.operationCount==0)
            exit(1);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"download of %@ failed. userinfo is %@", operation.request.URL, operation.userInfo);
        if(queue.operationCount==0)
            exit(1);
    }];
    [queue addOperation:operation];
于 2013-04-27T11:49:42.033 に答える