【发布时间】:2011-08-16 12:33:30
【问题描述】:
我正在使用 NSOperationQueue 和 NSOperation 来执行对 twitter 的请求。但是,当我执行此请求并接收结果时,应用程序会冻结几秒钟,直到所有结果都已下载。
有没有办法阻止这种情况发生?
编辑----
我的代码是:
- (void)getPublicTimeline {
TwitterRequest *request = [[TwitterRequest alloc] initWithRequestType:publicTimelineRequest andManager:self];
[queue addOperation:request];
[queueArray addObject:request];
[request release];
}
TwitterRequest (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];
}
推特经理:
- (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];
}
}
我只发布了获取公共时间线的代码。
【问题讨论】:
-
你能显示用于处理 twitter 请求的代码吗?
-
你为什么继续使用
[self performSelector:@selector(foo)]而不仅仅是[self foo]? -
我后来实现了方法声明,并没有更新代码。你认为这可能是一个原因吗?
-
这不是原因,只是不必要的。如果您需要在实现之前调用私有方法,只需在 .m 文件顶部的私有扩展名中声明它们即可。这个问题有一个很好的例子。 stackoverflow.com/questions/647079/…
-
您可能在这里的意思是您稍后实现了它们。如果是这种情况,请不要这样做。注释掉电话并在前面加上
NSAssert(NO, @"Implement");。这是一种更好的方式来提醒自己实施需要实施的事情,并在您认为已经完成时让您轻松搜索。
标签: objective-c freeze nsoperation nsoperationqueue