简体   繁体   中英

dispatch_async slow downs the UI and app

I am using dispatch_async for background uploads. From another Stackoverflow question I had found out that dispatch_async is better than PerformSelectorInBackground . But now after I called it the UI becomes very slow. Can anyone provide a solution for this? The code I had used is added below:

__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];

    }

});

Function code:

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

May be autoreleased objects slowing down... have to checked in instruments tool which function is taking more time.

//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
                         });
                     }
                 });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM