Как я могу сделать много NSURLConnection без пересечения всех запросов?

Возможно ли это сделать с помощью NSOperation? Я пытаюсь, но иногда это не работает.

Например, моя последовательность:

  1. Отметить 4 новости как прочитанные
  2. Отметить 3 новости как прочитанные
  3. Отметить 3 новости как прочитанные
  4. Перезагрузить источник новостей
  5. Отметить 4 новости как прочитанные
  6. Перезагрузить источник новостей

Иногда я думаю, что очередь не соблюдается... как я могу это сделать? поблагодарить

ПРИМЕР ***

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 в соответствии с вашим использованием

Другие вопросы по тегам