簡體   English   中英

dispatch_async減慢了UI和應用程序的速度

[英]dispatch_async slow downs the UI and app

我正在使用dispatch_async進行后台上傳。 從另一個Stackoverflow問題我發現dispatch_async優於PerformSelectorInBackground 但是現在在我調用之后,UI變得非常慢。 任何人都可以為此提供解決方案嗎? 我使用的代碼如下:

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

可能是自動釋放的對象減速...必須檢查儀器工具哪個功能需要更多時間。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM