2011-05-01 71 views
2

我正在使用NSOperationQueue和NSOperation來執行對twitter的請求。但是,當我執行此請求並收到結果時,應用程序會凍結幾秒鐘,直到下載所有結果。NSOperation&NSOperationQueue凍結應用

有沒有辦法阻止這種情況發生?

編輯----

我的代碼是:

- (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]; 
} 

Twitter的經理:

- (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]; 
    } 
} 

我只發佈的代碼用於獲取公衆的時間表。

+0

您能否顯示用於處理Twitter請求的代碼? – 2011-05-01 16:41:02

+0

爲什麼你繼續使用'[self performSelector:@selector(foo)]'而不僅僅是'[self foo]'? – 2011-05-01 16:47:54

+0

我後來實現了方法聲明,並沒有更新代碼。你認爲這可能是一個原因嗎? – 2011-05-01 16:50:32

回答

3

您可能正在使用非併發的NSOperation。請參見併發編程指南中的Operation Queues,尤其是「併發與非併發操作」一節。

儘管如此,我強烈建議使用異步NSURLConnection而不是自己的NSOperation來執行此類功能。這正是NSURLConnection做得很好。