2012-07-09 95 views
0

我正在使用dispatch_async进行后台上传。从另一个Stackoverflow问题,我发现dispatch_asyncPerformSelectorInBackground更好。但是现在我调用它之后,UI变得非常缓慢。任何人都可以为此提供解决方案吗?我使用的代码被添加如下:dispatch_async减慢界面和应用程序

__block NSString *someString; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
             (unsigned long)NULL), ^(void) { 

    if(someString != nil) 
    { 
     Class *className = [class sharedObject]; 
     [className sendContacts]; 

    } 

}); 

功能代码:

-(void) sendContacts { 

    NSURL *url = [NSURL URLWithString:@"myurl"]; 

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setRequestMethod:@"POST"]; 

    [request addRequestHeader:@"d" value:[[UIDevice currentDevice] uniqueIdentifier]]; 

    NSString *sessionKey = [[NSUserDefaults standardUserDefaults]valueForKey:@"UD_Sessionkey"]; 

    [request addRequestHeader:@"s" value:sessionKey]; 

    NSData *data=[[self createContactList] dataUsingEncoding: [NSString defaultCStringEncoding] ]; 

    NSMutableData *x = [[NSMutableData alloc] init]; 
    [x setData:data]; 

    [request setPostBody:x]; 

    [request setShouldContinueWhenAppEntersBackground:YES]; 
    [request setDelegate:self]; 
    [request setTimeOutSeconds:60]; 
    [request setDidFinishSelector:@selector(requestFinished:)]; 
    [request setDidFailSelector:@selector(requestFailed:)]; 
    [request startAsynchronous]; 

} 


- (void)requestFinished:(ASIHTTPRequest *)requestData 
{ 

    NSLog(@"Response : %@", [requestData responseString]); 

    if (self.currentLimit_ > totalCount) { 

     //do nothing 
    } else { 

     [self sendContacts]; 
    } 


} 

- (NSString *)createContactList 
{ 

    self.currentLimit_ = self.currentLimit_ + 10; 
    self.currentCount_ = self.currentCount_ + 1; 

    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); 
    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); 

    totalCount = nPeople; 

    NSMutableString *requestContactsString = [[NSMutableString alloc] init]; 


    [requestContactsString appendString:@"<list>"]; 

    for (int i=currentCount; i<self.currentLimit_; i++) 
    { 
     NSLog(@"Started : %d", i); 
     if (self.currentLimit_ > totalCount) { 
      break; 
     } 

     if (i < self.currentLimit_ - 10) { 

      continue; 
     } 

     ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i); 
     CFTypeRef firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty); 
     CFTypeRef lastName = ABRecordCopyValue(ref, kABPersonLastNameProperty); 
     CFTypeRef email = ABRecordCopyValue(ref, kABPersonEmailProperty); 
     CFTypeRef phone = ABRecordCopyValue(ref, kABPersonPhoneProperty); 

     //requestContactsString = [requestContactsString stringByAppendingFormat:@"<item>"]; 
     [requestContactsString appendString:@"<item>"]; 

     if(firstName) 
     { 
      [requestContactsString appendString:[NSString stringWithFormat:@"<firstname>%@</firstname>", firstName]]; 

      CFRelease(firstName); 
      firstName = nil; 
     } 
     if(lastName) 


      [requestContactsString appendString:[NSString stringWithFormat:@"<lastname>%@</lastname>", lastName]]; 
      CFRelease(lastName); 
      lastName = nil; 
     } 
     if(email) 
     { 
      if(ABMultiValueGetCount(email)>0) 
      { 
       CFTypeRef em = ABMultiValueCopyValueAtIndex(email, 0); 

       [requestContactsString appendString:[NSString stringWithFormat:@"<email>%@</email>", em]]; 

       CFRelease(em); 
      } 
      CFRelease(email); 
      email = nil; 
     } 
     if(phone) 
     { 
      if(ABMultiValueGetCount(phone)>0) 
      { 
       CFTypeRef ph = ABMultiValueCopyValueAtIndex(phone, 0); 

       [requestContactsString appendString:[NSString stringWithFormat:@"<phone>%@</phone>", ph]]; 
       CFRelease(ph); 
      } 
      CFRelease(phone); 
      phone = nil; 
     } 

     [requestContactsString appendString:@"</item>"]; 

    } 



    if(allPeople) 
    { 
     CFRelease(allPeople); 
     allPeople = nil; 
    } 
    if(addressBook) 
    { 
     CFRelease(addressBook); 
     addressBook = nil; 
    } 

    [requestContactsString appendString:@"</list>"]; 

    NSString *hashedContactsString = [self generateHashedPassword:requestContactsString]; 

    NSLog(@"Contacts : %@", requestContactsString); 

    //contact list has changed 
    if(![[[NSUserDefaults standardUserDefaults] valueForKey:@"contacts"] isEqualToString:hashedContactsString]) 
    { 
     return requestContactsString; 
    } 
    else return nil; 
} 
+0

你确定你没有发布到UI队列吗?你应该创建自己的队列。 – Dani 2012-07-09 04:55:45

+1

我不知道是什么导致了你的问题,但是如果你只在块中读取someString,你不需要'__block'。如果要在块内更改该变量的值,则使用__block。 – 2012-07-09 04:58:04

+0

@Dani:全局队列与主队列绝对不一样。 – 2012-07-09 05:27:24

回答

2

可能被自动释放放缓对象...不得不在仪器工具功能花费更多的时间进行检查。

//Can you try using autoreleasepool for the threaded function. 
    dispatch_async(yourQueue, ^{ 
        @autoreleasepool { 
         //Your code to be run in background 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          //Any UI updates 
         }); 
        } 
       }); 
相关问题