NSOperation & NSOperationQueue приложение для замораживания - PullRequest
2 голосов
/ 01 мая 2011

Я использую NSOperationQueue и NSOperation для выполнения запросов в Twitter.Однако, когда я выполняю этот запрос и получаю результаты, приложение останавливается на несколько секунд, пока все результаты не будут загружены.

Есть ли способ остановить это?

Edit----

Мой код:

- (void)getPublicTimeline {
    TwitterRequest *request = [[TwitterRequest alloc] initWithRequestType:publicTimelineRequest andManager:self];
    [queue addOperation:request];
    [queueArray addObject:request];
    [request release];
}

Запрос Twitter (NSOperation)

- (id)initWithRequestType:(requestTypeEnum)type andManager:(TwitterManager *)managr {
self = [super init];
if (self) {
    [self setRequestType:type];
    [self setManager:managr];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    [self performSelector:@selector(startWithRequest)];
}
return self;

}

- (void)startWithRequest {
if (requestType == statusRequest) {
    [self performSelector:@selector(doStatusRequest)];
}
  else if (requestType == privateMessageRequest) {
    [self performSelector:@selector(doPrivateMessageRequest)];
}
else if (requestType == sentPrivateMessageRequest) {
    [self performSelector:@selector(doSentPrivateMessageRequest)];
}
else if (requestType == allFollowersRequest) {
    [self performSelector:@selector(allFollowersRequest)];
}
else if (requestType == publicTimelineRequest) {
    [self performSelector:@selector(doPublicTimelineRequest)];
}

}

- (void)doPublicTimelineRequest {
    connectionId = [manager.engine getPublicTimeline];
}

Twitter Manager:

- (void)statusesReceived:(NSArray *)statuses forRequest:(NSString *)connectionIdentifier {
     TwitterRequest *lastObj = (TwitterRequest *)[queueArray lastObject];
    if (lastObj.requestType == statusRequest) {
        if ([[self delegate] conformsToProtocol:@protocol(TwitterManagerDelegate)] && [[self delegate] respondsToSelector:@selector(manager:receivedStatuses:)]) {
            [[self delegate] manager:self receivedStatuses:statuses];
        }
    }
    else if (lastObj.requestType == publicTimelineRequest) {
        NSMutableArray *tweets = [[NSMutableArray alloc] init];
        for (int i = 0; i < [statuses count]; i++) {
            TimelineTweet *tt = [[TimelineTweet alloc] init];
            User *user = [[User alloc] init];

            tt.createdAt = [[statuses objectAtIndex:i] objectForKey:@"created_at"];
            if ([[[statuses objectAtIndex:i] objectForKey:@"favorited"] isEqualToString:@"false"]) 
                tt.isFavorited = FALSE;
            else 
                tt.isFavorited = TRUE;
            if ([[[statuses objectAtIndex:i] objectForKey:@"retweeted"] isEqualToString:@"false"]) 
                tt.retweeted = FALSE;
            else 
                tt.retweeted = TRUE;
            tt.retweetCount = [[statuses objectAtIndex:i] objectForKey:@"retweet_count"];
            tt.source = [[statuses objectAtIndex:i] objectForKey:@"source"];
            tt.tweet = [[statuses objectAtIndex:i] objectForKey:@"text"];
            tt.tweetID = [[statuses objectAtIndex:i] objectForKey:@"id"];
            user.createdAt = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"created_at"];
            user.description = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"description"];
            user.favouritesCount = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"favourites_count"];
            user.friendsCount = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"friends_count"];
            if ([[[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"verified"] isEqualToString:@"false"]) 
                user.isVerified = FALSE;
            else
                user.isVerified = TRUE;
            user.lang = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"lang"];
            user.listCount = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"listed_count"];
            user.location = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"location"];
            user.name = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"name"];
            user.profileBackgroundColor = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"profile_background_color"];
            user.profileBackgroundImageURL = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"profile_background_image_url"];
            user.profileImageURL = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"profile_image_url"];
            user.screenName = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"screen_name"];
            user.tweetCount = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"statuses_count"];
            user.url = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"url"];
            user.userID = [[[statuses objectAtIndex:i] objectForKey:@"user"] objectForKey:@"id"];
            user.profileImageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[user profileImageURL]]];
            tt.user = user;
            [user release];
            [tweets addObject:tt];
            if ([[self delegate] conformsToProtocol:@protocol(TwitterManagerDelegate)] && [[self delegate] respondsToSelector:@selector(manager:didReceivePublicTimelineObject:)]) {
                [[self delegate] manager:self didReceivePublicTimelineObject:tt];
            }
            [tt release];
        }
        if ([[self delegate] conformsToProtocol:@protocol(TwitterManagerDelegate)] && [[self delegate] respondsToSelector:@selector(manager:didRecievePublicTimeline:)]) {
            [[self delegate] manager:self didRecievePublicTimeline:tweets];
        }
        [tweets release];
    }
}

Я только опубликовал код для получения общедоступной временной шкалы.

1 Ответ

3 голосов
/ 01 мая 2011

Возможно, вы используете не одновременный NSOperation. См. Очереди операций в Руководстве по программированию параллелизма, особенно раздел «Параллельные и непоследовательные операции»

Как правило, я бы настоятельно рекомендовал использовать асинхронный NSURLConnection вместо вашего NSOperation для выполнения такого рода функций. Это именно то, что NSURLConnection делает очень хорошо.

...