0
我正在使用dispatch_async
進行後臺上傳。從另一個Stackoverflow問題,我發現dispatch_async
比PerformSelectorInBackground
更好。但是現在我調用它之後,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;
}
你確定你沒有發佈到UI隊列嗎?你應該創建自己的隊列。 – Dani 2012-07-09 04:55:45
我不知道是什麼導致了你的問題,但是如果你只在塊中讀取someString,你不需要'__block'。如果要在塊內更改該變量的值,則使用__block。 – 2012-07-09 04:58:04
@Dani:全局隊列與主隊列絕對不一樣。 – 2012-07-09 05:27:24