Как я могу сделать много NSURLConnection без пересечения всех запросов?
Возможно ли это сделать с помощью NSOperation? Я пытаюсь, но иногда это не работает.
Например, моя последовательность:
- Отметить 4 новости как прочитанные
- Отметить 3 новости как прочитанные
- Отметить 3 новости как прочитанные
- Перезагрузить источник новостей
- Отметить 4 новости как прочитанные
- Перезагрузить источник новостей
Иногда я думаю, что очередь не соблюдается... как я могу это сделать? поблагодарить
ПРИМЕР ***
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:delegate.reader
selector:@selector(setUnread:)
object:item];
[delegate.queue addOperation:operation];
[operation release];
Я думаю, что другие просят, как этот старт после первого 1... но я хочу, чтобы 2-й стартовал только тогда, когда 1-й закончен...
3 ответа
Вам нужно создать зависимости между операциями, чтобы у вас было какое-то условие, например:
[secondOperation addDependency:firstOperation];
[operationQueue addOperation:firstOperation];
[operationQueue addOperation:secondOperation];
Для меня это звучит так, как будто вы ищете очередь последовательных операций.
Просто установите maxConcurrentOperationCount
в очереди на 1
и он будет запускать только одну операцию за раз.
Это должно быть сделано перед добавлением операций в очередь. Обратите внимание, что это нужно сделать только один раз, а не для каждой операции, как показано ниже.
delegate.queue.maxConcurrentOperationCount = 1;
[delegate.queue addOperation:someOperation];
Создайте класс CustomNSURLConnection, как показано ниже.
CustomNSURLConnection.h
#import <Foundation/Foundation.h>
typedef void (^ServiceBlock)(NSString *result);
@interface CustomNSURLConnection : NSURLConnection
@property (nonatomic, copy) ServiceBlock serviceBlock;
@property (nonatomic, retain) NSMutableData *serviceResponseData;
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate usingCallback:(ServiceBlock)callBackBlock;
@end
CustomNSURLConnection.m
#import "CustomNSURLConnection.h"
@implementation CustomNSURLConnection
@synthesize serviceBlock, serviceResponseData;
-(id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate usingCallback:(ServiceBlock)callBackBlock{
self = [super initWithRequest:request delegate:delegate];
if (self) {
self.serviceBlock = callBackBlock;
self.serviceResponseData = [NSMutableData data];
}
return self;
}
@end
WebServiceHitter.h
#import "CoffeeshopCustomNSURLConnection.h"
@interface WebServiceHitter : NSObject
@end
WebServiceHitter.m
@interface CoffeeShopWebServiceHitter()
@property (nonatomic, retain) NSMutableData *responseData;
#pragma mark - NSURLConnection Delegate Methods
- (void)connection:(CustomNSURLConnection *)connectionDb didReceiveResponse:(NSURLResponse *)response {
CustomNSURLConnection *specializedNSURLDataConnection = (CustomNSURLConnection *)connectionDb;
[specializedNSURLDataConnection.serviceResponseData setLength:0];
}
- (void)connection:(CustomNSURLConnection *)connectionDb didReceiveData:(NSData *)data {
CustomNSURLConnection *specializedNSURLDataConnection = (CoffeeshopCustomNSURLConnection *)connectionDb;
[specializedNSURLDataConnection.serviceResponseData appendData:data];
}
- (void)connection:(CustomNSURLConnection *)connectionDb didFailWithError:(NSError *)error {
NSLog(@"Connection failed: %@", [error description]);
}
- (void)connectionDidFinishLoading:(CustomNSURLConnection *)finishedWithConnection {
CustomNSURLConnection *specializedNSURLConnection = (CustomNSURLConnection*)finishedWithConnection;
NSString *responseString = [[NSString alloc] initWithData:specializedNSURLConnection.serviceResponseData encoding:NSASCIIStringEncoding];
specializedNSURLConnection.serviceResponseData = nil;
specializedNSURLConnection.serviceBlock(responseString);
}
@end
И создайте свой запрос веб-сервиса в файлах webservicehitter в соответствии с вашим использованием